5

私は、H.264 および AAC を含む MP4 ファイルをストリーミングに適した MPEG-TS セグメントに変換する libavformat API ラッパーに取り組んでいます。再エンコードせずに単純なストリーム コピーを行っているだけですが、作成したファイルは 24 fps ではなく3600 fpsでビデオを再生します。

ffprobe https://gist.github.com/chrisballinger/6733678からの出力の一部を次に示します。破損したファイルは以下のとおりです。

r_frame_rate=1/1
avg_frame_rate=0/0
time_base=1/90000
start_pts=0
start_time=0.000000
duration_ts=2999
duration=0.033322

ffmpeg を介して手動で送信された同じ入力ファイルには、適切なタイムスタンプ情報が含まれています。

r_frame_rate=24/1
avg_frame_rate=0/0
time_base=1/90000
start_pts=126000
start_time=1.400000
duration_ts=449850
duration=4.998333

libavformat のセットアップのどこかに問題があると思います: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349ここで、必要な ffmpeg.c からのコードの束を転用しました。ダイレクト ストリーム コピーの場合。

3600 は「マジック ナンバー」(60*60) のように見えるため、タイム スケールを適切に設定していないのと同じくらい簡単かもしれませんが、自分のコードが ffmpeg/avconv 自体から分岐している場所がわかりません。

ここでも同様の質問がありますが、彼らは私ほど遠くまで到達したとは思いません: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

4

2 に答える 2

2

実際には、pts と dts が台無しになっています。

MP4 ファイルには MP4 タイムベースに従ってポイントと dt があり、90000Hz クロックで動作する ts マルチプレクサに同じポイントと dt を渡しています。たとえば、fps が 30 フレーム/秒の場合、ts では 3000 ティックごとにビデオ フレームを表示することを意味します。

av_rescal_q を使用して、pts を mp4 から ts timbase に変更する必要があります。

于 2013-10-01T05:14:06.793 に答える