0

h264 でエンコードされたビデオと AAC でエンコードされたオーディオを含む mp4 ファイルを受け取り、それをセグメント化された .ts ファイルに書き込む C コードをいくつか作成しました。

コードはここで見ることができます: http://pastebin.com/JVdgjM9G

問題は、コードがオーディオ パケットでチョークすることです。h264 から変換しているため、最終的にビデオ フレームで動作するようになった "h264_mp4toannexb" を使用する必要があります。ただし、プログラムが最初のオーディオ パケット (以下のストリーム 1) に到達するとすぐにクラッシュします。

出力例:

Output #0, mpegts, to 'testvideo':
    Stream #0.0: Video: libx264, yuv420p, 1280x720, q=2-31, 1416 kb/s, 90k tbn, 23.98 tbc
    Stream #0.1: Audio: libfaac, 48000 Hz, stereo, 127 kb/s
First chunk: testvideo-00001.ts
Read frame, keyframe: 1, index: 0
Did bitfilter fun!
Read frame, keyframe: 0, index: 0
Did bitfilter fun!
(...this repeats several more times, truncated for space...)
Did bitfilter fun!
Read frame, keyframe: 0, index: 0
Did bitfilter fun!
Read frame, keyframe: 1, index: 1
base(54516) malloc: *** error for object 0x7fd2db404520: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

オーディオ ストリームでもフィルタを実行するようにコードを変更しようとしましたが (audio_stream->codec代わりに を使用video_stream->codec)、フィルタからエラーが発生するだけです。

通話しようとすると問題が発生しav_interleaved_write_frame(output_context, &packet);ます。フィルタリングされたビデオ パケットの場合、問題はありませんが、オーディオ パケットは完全にチョークします。しかし、私はその理由にちょっと困惑しているので、どんな助けも大歓迎です。

4

1 に答える 1

0

av_free_packetbitfilter 操作が実際にビデオ パケットを解放した後に呼び出しが行われたことがわかります。その呼び出しを削除すると、コードが正しく実行されました!

于 2013-06-13T08:58:43.560 に答える