我正在运行时从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的源代码编译的。
欢迎任何关于如何解决这个问题的想法。目前,我不在那些:)
答案 0 :(得分:0)
好吧,问题不在于avformat_write_header,而是我没有将每个写入的视频数据包的PTS值设置为AV_NOPTS_VALUE。
一旦我为每个视频包设置了它,一切正常。
我认为AV_NOPTS_VALUE是默认值,因为我从不需要设置任何特殊的PTS值。