avassetwriterでCMTimeを理解するのを手伝ってください
-
28-10-2019 - |
質問
AvassetWriterを使用して30fpsでモーションJPEGのストリームをビデオファイルに変換する方法を理解するのに苦労しています。私が取得していない部分は、[Adapter AppendPixelBuffer:Buffer withPresentationTimeresenttime]メソッドです。
30fps mpeg4ビデオを出力する場合、withpresentationtime値を計算するにはどうすればよいですか?
ビデオソースは、30FPSモーションJPEGをリアルタイムでストリーミングするカメラです。
どんな考えにも感謝します。
ありがとう
解決
cmtimemakeを使用してCMTIME構造を生成する必要があります。フレームごとに時間を1/30秒増やす必要があります。
これがスケッチです:
CMTime time = CMTimeMake(0, 30); // (time, time_scale)
for(each image) {
[adaptor appendPixelBuffer:buffer withPresentationTime:time]
time.value += 1;
}
示されているように、時間のセットアップがある場合、最小の時間分解能は1/30秒です。 time / time_scale = 1秒。 H.264に特定の要件があるかどうかはわかりません。 AVFoundationは、キャプチャするときに1000000000(1,000,000,000または10億)の時間尺度を使用します(私の経験では)。
アップデート:
レビューするだけです。 cmtime structから:
CMTimeValue value; /*! @field value The value of the CMTime. value/timescale = seconds. */
CMTimeScale timescale; /*! @field timescale The timescale of the CMTime. value/timescale = seconds. */
タイムベースはビデオ全体で同じままです。時間スケールが30の現在の値があるとしましょう。秒単位の現在の時間は10/30 = 0.33333秒です。映画の40番目のフレームの時間値は40/30 = 1.33333です。したがって、40番目のフレームは映画の1.3333秒でレンダリングする必要があります。
この時間ベースがH.264ビデオに適しているかどうかはわかりません。私はスペックに精通していません。ビデオをキャプチャするとき、ビデオフレームのプレゼンテーション時間ベースは1000000000です。技術的には重要ではないはずです。時間は合理的な数です-1000000000 / 1000000000 = 1秒および30 /30 = 1秒。