avformat_write_header生成无效标头(导致MPG损坏)

时间:2013-01-22 11:23:42

标签: ffmpeg video-encoding libavcodec libav libavformat

我正在运行时从3D引擎输入的图像渲染视频文件(我不传递实际的图片文件,只是RGB内存)。 当使用CODEC_ID_H264作为视频编解码器输出MP4时,这非常有效。

但是当我想使用CODEC_ID_MPEG2VIDEO创建一个MPG文件时,生成的文件就会被破坏。没有播放器可以正确播放视频,当我想要将MPG与另一个MPG文件连接,并在另一个步骤中转换结果MP4时,生成的.mp4文件包含两个视频,但是来自原始MPG视频的许多帧(仅限于视频!声音很好)简单地跳过了。

起初我认为MPG - > MP4转换是问题所在,但后来我注意到来自视频渲染引擎的初始MPG已经坏了,这可能代表断页。但是,不确定它是否是系统或序列标题。 或者,如果它可能是完全不同的东西。

如果你想看看,这里是文件: http://www.file-upload.net/download-7093306/broken.mpg.html

同样,当从视频渲染引擎直接创建MP4时,完全相同的多路复用代码完全正常,因此我非常确定输入数据,swscale()等是正确的。唯一的区别是使用了CODEC_ID_H264并设置了一些额外的变量(如qmin,qmax等),这些变量都是H264特有的,因此不应产生影响。

此外,avformat_write_header和av_write_trailer都没有报告错误。

作为附加信息,当在VLC播放器中查看MPG的编解码器数据时,它无法显示FPS,分辨率和格式(应显示640x360,30 fps和4:2:0 YUV)。

我正在使用一个相当新的(2-3个月,也许)FFmpeg版本,我是从MinGW的源代码编译的。

欢迎任何关于如何解决这个问题的想法。目前,我不在那些:)

1 个答案:

答案 0 :(得分:0)

好吧,问题不在于avformat_write_header,而是我没有将每个写入的视频数据包的PTS值设置为AV_NOPTS_VALUE。

一旦我为每个视频包设置了它,一切正常。

我认为AV_NOPTS_VALUE是默认值,因为我从不需要设置任何特殊的PTS值。