FFmpeg av_read_frame没有正确读取帧?

时间:2016-08-02 06:39:14

标签: video ffmpeg

好吧,所以我以.yuv格式下载了一些原始UHD序列,并用.mp4容器中的ffmpeg编码(h264 4:4:4,100%质量,25fps)。当我使用ffprobe找出编码了多少帧时,我得到600,这就是24秒的视频。

但是,当我通过av_read_frame运行那些编码的视频序列时,我只会在av_read_frame返回错误代码-12之前处理40-50%的帧。因此,我猜测流中间有一些数据包会被av_read_frame读取并强制函数返回-12

我的问题是,我应该如何处理这个问题,以便我可以编码全帧数(600)?如果av_read_frame返回的值不同于0我应该av_free_packet并继续阅读下一帧吗?由于av_read_frame为错误代码返回值< 0,因此EOF使用了哪个错误代码,因此我可以隔离文件代码的末尾?

2 个答案:

答案 0 :(得分:1)

虽然很难说你的解码有什么问题,但-12仍然不是一个无法理解的神奇数字。

printf("%s\n", av_err2str(-12));

这将打印Cannot allocate memory,这是真正的问题。

当从av_read_frame()获得正回报值时,可以继续。

av_free_packet()已弃用,而是在每个av_packet_unref()循环结束时使用av_read_frame()

while(av_read_frame(fmt_ctx, &pkt) >= 0) {
    // decode packet and other stuff
    av_packet_unref(&pkt); 
}

最后,通常不需要担心EOF,因为av_decode_video2()或其他解码函数会将int参数设置为适当的值,指示是否存在要解压缩的帧。

如果您正在使用相当新的ffmpeg(&gt; = 3.1)解码/编码API或者确实需要处理EOF,请将返回值与AVERROR_EOF进行比较。

答案 1 :(得分:0)

对于某些版本的 libav ,实用程序av_err2str未编译,我使用以下技巧:

#undef  av_err2str
#define av_err2str(errnum) av_make_error_string((char*)__builtin_alloca(AV_ERROR_MAX_STRING_SIZE), AV_ERROR_MAX_STRING_SIZE, errnum)