Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video FFmpeg av_读取帧未正确读取帧?_Video_Ffmpeg - Fatal编程技术网

Video FFmpeg av_读取帧未正确读取帧?

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 我的问

好的,我下载了一些.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


我的问题是,我应该如何处理这个问题,以便我可以编码完整数量的帧(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
。谢谢你的回答。在阅读函数时,我应该更加小心。