将mp4转换为mpeg2-ts会导致音频数据包崩溃

时间:2013-06-11 11:45:11

标签: c h.264 libav mpeg2-ts

我编写了一些C代码,它采用带有h264编码视频和AAC编码音频的mp4文件,并将其写入分段.ts文件。

可在此处查看代码: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);时出现问题 - 对于过滤后的视频数据包,没有问题,但音频数据包完全阻塞了。虽然如此,我有点难过,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

在bitfilter操作实际释放视频数据包之后,结果是av_free_packet调用。删除该调用导致代码正确运行!