2012-06-18 7 views
6

AVAssetWriterによって書き込まれたH.264 movファイルを同時に読み書きしようとしています。私は個々のNALユニットを抽出し、ffmpegのAVPacketsにパックし、ffmpegを使って別のビデオフォーマットに書き込んだ。それは動作し、結果のファイルは再生スピードが正しくないことを除いてうまく再生されます。生のH.264データから正しいPTS/DTS値を計算するにはどうすればよいですか?あるいは、それを得るための他の方法があるかもしれませんか?iOSで生成されたraw H264 mdatからPTSを取得するAVAssetWriter

  1. リミットは30に最小/最大フレームレートをキャプチャし、出力ファイルは30fpsでなることを想定しています。ここ

    は、私が試したものです。実際、そのfpsは常に私が設定した値よりも小さくなっています。また、パケットごとにfpsが一定ではないと思います。

  2. 書かれたサンプルのプレゼンテーションタイムスタンプを覚えておき、サンプルがNALUに1対1で対応し、保存されたタイムスタンプを出力パケットに適用すると仮定します。これは機能しません。

  3. PTSを0またはAV_NOPTS_VALUEに設定します。動作しません。

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

+2

また、AVAssetWriterで作成されたmovファイルからH.26​​4を同時に読み込もうとしており、パイプ/通常のファイル読み込みを使用して実行できませんでした。それが書かれている間にあなたはどのようにそれを読むことができましたか?ありがとう! –

+3

通常のファイルの読み込みを使用しますが、EOFの読み込みをやり直すのではなく、遅かれ早かれあなたの読書活動は成功するでしょう。 – kolyuchiy

+2

@kolyuchiy - ディスパッチソースは、システムをより良く使用します。 FILE記述子に読み取り元を設定します。読み込むデータがあるときにブロックが呼び出されます。 EOFが発生した場合は、ファイルのエラーをクリアしてください。 –

答えて

5

PTS/DTS情報を生成するには、自分で生成するか、MP4/MOVコンテナ内のAtomのタイミング情報にアクセスする必要があります。 libavformatのFFmpegのmov.cが役に立ちます。

AVAssetWriterで書き込む各サンプル/フレームは、VCL NALと1対1で対応します。あなたがしているすべてが変換している場合、FFmpegはすべての重い持ち上げを行います。あるコンテナ形式から別のコンテナ形式に移行するときにタイミング情報を適切に維持します。

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

- 編集 -

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

+1

ありがとう!実際には、CMSampleBuffersには出力パケットに対応する正しいPTSが含まれています。私はあまりにも怠け者で、その方向に向かいました。これは私の問題を解決しました。 – kolyuchiy

関連する問題