好吧,所以我以.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
使用了哪个错误代码,因此我可以隔离文件代码的末尾?
答案 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)