カメラと関連するモーションデータからフレームをキャプチャしようとしています。 私はタイムスタンプを使っています。ビデオとモーションはファイルに書き込まれ、処理されます。そのプロセスでは、私はすべてのビデオのための動きのフレームオフセットを計算することができます。iOS:カメラとモーションデータのフレームを同期する
同じタイムスタンプのモーションデータとビデオデータは、0.2秒から0.3秒までの異なる時間で互いにオフセットされています。 このオフセットは1つのビデオでは一定ですが、ビデオによって異なります。 それは私がいくつかの校正された値を引くことができるようになるたびに同じオフセットだったが、そうではない。
タイムスタンプを同期するよい方法はありますか? 私は正しく録音していないのでしょうか? 同じ参照フレームを使用するより良い方法はありますか?私はUnixの時間を取得するためにオフセットを追加して
CoreMotion戻り、システムの稼働時間に対するタイムスタンプ:
uptimeOffset = [[NSDate date] timeIntervalSince1970] -
[NSProcessInfo processInfo].systemUptime;
CMDeviceMotionHandler blk =
^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error){
if(!error){
motionTimestamp = motion.timestamp + uptimeOffset;
...
}
};
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:[NSOperationQueue currentQueue]
withHandler:blk];
フレームを取得するには、私はAVCaptureVideoDataOutputSampleBufferDelegateを使用している高精度でタイムスタンプ。また、UNIXの時刻にオフセットされています
-(void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
CMTime frameTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
if(firstFrame)
{
firstFrameTime = CMTimeMake(frameTime.value, frameTime.timescale);
startOfRecording = [[NSDate date] timeIntervalSince1970];
}
CMTime presentationTime = CMTimeSubtract(frameTime, firstFrameTime);
float seconds = CMTimeGetSeconds(presentationTime);
frameTimestamp = seconds + startOfRecording;
...
}
こんにちはservalex、これまでにこれを克服できましたか? –
@ ShaiBen-Tovim、答えを加えました。 残念ながら、私はAPIで有用なものを見つけられなかったので、ハックする必要がありました。 – servalex