6

AVAssetWriter で書き込んだ H.264 mov ファイルを同時に読み書きしようとしています。個々の NAL ユニットを抽出し、それらを ffmpeg の AVPackets にパックし、ffmpeg を使用して別のビデオ形式に書き込むことができました。それは機能し、再生速度が正しくないことを除いて、結果のファイルはうまく再生されます。生の H.264 データから正しい PTS/DTS 値を計算するにはどうすればよいですか? または、それらを取得する他の方法が存在する可能性がありますか?

これが私が試したことです:

  1. キャプチャの最小/最大フレーム レートを 30 に制限し、出力ファイルが 30 fps になると仮定します。実際、その fps は常に設定した値よりも低くなります。また、fps はパケットごとに一定ではないと思います。

  2. 書き込まれた各サンプルのプレゼンテーション タイムスタンプを記憶し、サンプルが 1 対 1 で NALU にマッピングされ、保存されたタイムスタンプを出力パケットに適用すると仮定します。これはうまくいきません。

  3. PTS を 0 または AV_NOPTS_VALUE に設定します。うまくいきません。

それについてグーグルで調べたところ、生のH.264データには通常、タイミング情報が含まれていないことがわかりました。SEI内にタイミング情報が含まれている場合がありますが、私が使用するファイルには含まれていません。一方で、私がやろうとしていることを正確に実行するアプリケーションもいくつかあるので、何とか可能だと思います。

4

1 に答える 1

5

それらを自分で生成するか、MP4/MOV コンテナー内のタイミング情報を含む Atom にアクセスして、PTS/DTS 情報を生成する必要があります。libavformat の FFmpeg の mov.c が役立つ場合があります。

AVAssetWriter で書き込む各サンプル/フレームは、VCL NAL と 1 対 1 でマッピングされます。あなたがしているのは変換だけなら、FFmpegにすべての面倒な作業をさせてください。あるコンテナ形式から別のコンテナ形式に移行するときに、タイミング情報が適切に維持されます。

AVAssetWriter によって生成されたビットストリームには、SEI データが含まれていません。SPS/PPS/I/P フレームのみが含まれます。SPS には、VUI または HRD パラメータも含まれていません。

- 編集 -

また、CMSampleBufferRef から PTS 情報を保存する場合、タイム ベースがターゲット コンテナのタイム ベースと異なる可能性があることに注意してください。たとえば、AVFoundation のタイム ベースはナノ秒で、FLV ファイルはミリ秒です。

于 2012-06-22T21:20:47.510 に答える