Video FFmpeg av_读取帧未正确读取帧?
好的,我下载了一些.yuv格式的原始UHD序列,并用.mp4容器中的ffmpeg对它们进行编码(h264 4:4:4,100%质量,25fps)。当我使用ffprobe找出编码了多少帧时,我得到了600帧,这就是24秒的视频 但是,当我通过Video FFmpeg av_读取帧未正确读取帧?,video,ffmpeg,Video,Ffmpeg,好的,我下载了一些.yuv格式的原始UHD序列,并用.mp4容器中的ffmpeg对它们进行编码(h264 4:4:4,100%质量,25fps)。当我使用ffprobe找出编码了多少帧时,我得到了600帧,这就是24秒的视频 但是,当我通过av\u read\u frame运行这些编码视频序列时,在av\u read\u frame返回错误代码-12之前,我只处理了大约40-50%的帧。所以我疯狂地猜测,在流的中间有一些数据包被av\u read\u frame读取,并强制函数返回-12 我的问
av\u read\u frame
运行这些编码视频序列时,在av\u read\u frame
返回错误代码-12
之前,我只处理了大约40-50%的帧。所以我疯狂地猜测,在流的中间有一些数据包被av\u read\u frame
读取,并强制函数返回-12
我的问题是,我应该如何处理这个问题,以便我可以编码完整数量的帧(600)?当
av_read_frame
返回的值与0
不同时,我是否应该av_free_packet
并继续读取下一帧?既然av\u read\u frame
返回错误代码的值<0
,那么哪个错误代码用于EOF
,这样我就可以隔离文件结尾代码了 虽然很难说解码出了什么问题,但-12
并不是一个无法理解的神奇数字
printf("%s\n", av_err2str(-12));
这将打印无法分配内存
,这才是真正的问题
当从av\u read\u frame()
获取正返回值时,可以继续
av\u free\u packet()
已被弃用,在每个av\u read\u frame()循环的末尾使用av\u packet\u unref()
while(av_read_frame(fmt_ctx, &pkt) >= 0) {
// decode packet and other stuff
av_packet_unref(&pkt);
}
最后,通常不需要担心EOF,因为av_decode\u video2()
或其他解码函数会将int参数设置为适当的值,指示是否有要解压缩的帧
如果您正在使用全新的ffmpeg(>=3.1)解码/编码API,或者确实需要处理EOF,请将返回值与AVERROR\u EOF
进行比较 对于某些版本的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)
不幸的是,我使用的是旧版本的ffmpeg,我必须使用av\u-free\u-packet
。谢谢你的回答。在阅读函数时,我应该更加小心。