2017-02-08 11 views
2

カメラと関連するモーションデータからフレームをキャプチャしようとしています。 私はタイムスタンプを使っています。ビデオとモーションはファイルに書き込まれ、処理されます。そのプロセスでは、私はすべてのビデオのための動きのフレームオフセットを計算することができます。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; 
    ... 
} 
+0

こんにちはservalex、これまでにこれを克服できましたか? –

+0

@ ShaiBen-Tovim、答えを加えました。 残念ながら、私はAPIで有用なものを見つけられなかったので、ハックする必要がありました。 – servalex

答えて

0

私はこの問題に見つけることができた最善の解決策は、録画された映像の上に機能トラッカーを実行する強力な機能の一つを選んで、速度をプロットする ましたそれはX軸に沿った動きであり、このプロットを加速度計のYデータと相関させます。

横座標に沿って互いにオフセットされた2つの同様のプロットがある場合、オフセットを見つけることを可能にするcross-correlationというテクニックがあります。

このアプローチの明らかな欠点があります。ビデオ処理が必要なため、速度が遅いです。

+0

これは、この爪のための1つの巨大なハンマーです! 'deviceMotionUpdateInterval'の設定を変えましたか? CMサンプルレートは、ビデオフレームレートではあまりにも「低速」ですか?オフセットや時間の計算で隠れ丸めエラーが発生する可能性がありますか? –

関連する問題