我一直在尝试复制一个 AVFrame 就像在 ffmpeg: make a copy from a decoded frame (AVFrame) 中回答的那样。但是,我似乎无法从 av_frame_copy() 获得正返回码。
这基本上是我在做什么:
AVFrame *copyFrame = NULL;
copyFrame = av_frame_alloc();
int return_code = av_frame_copy(copyFrame, originalFrame);
if(return_code < 0){
fprintf(stderr, "av_frame_copy failed with return code %d\n", return_code);
return(1);
}
如果有帮助,我从 av_frame_copy 得到的返回码是 -22。
最佳答案
如果你阅读 av_frame_copy
的文档,它会说“这个函数没有分配任何东西,dst 必须已经初始化并分配了与 src 相同的参数。”
av_frame_alloc
除了分配 AVFrame
结构并将其初始化为一些默认值外,不做任何事情。最重要的是,它不会为帧数据分配缓冲区或准备要使用的帧。 av_frame_copy
失败,因为目标帧没有设置正确的像素格式或分配的缓冲区。
如果你想克隆一个帧(通过增加它的引用计数器,而不是创建一个深拷贝),你可以使用 av_frame_clone
或 av_frame_ref
。
如果要移动框架,可以使用 av_frame_move_ref
。
但是你可能想要做一个适当的深拷贝。在这种情况下,您可以查看 av_frame_make_writable
的源代码。如果框架不可写,则此函数会对其进行深层复制,因此我们可以使用相同的逻辑在此处对框架进行深层复制:
AVFrame *copyFrame = av_frame_alloc();
copyFrame->format = frame->format;
copyFrame->width = frame->width;
copyFrame->height = frame->height;
copyFrame->channels = frame->channels;
copyFrame->channel_layout = frame->channel_layout;
copyFrame->nb_samples = frame->nb_samples;
av_frame_get_buffer(copyFrame, 32);
av_frame_copy(copyFrame, frame);
av_frame_copy_props(copyFrame, frame);
请注意,我尚未检查所调用函数中的错误。你应该在你的真实代码中做到这一点。为简洁起见,我在这里省略了它。
关于c++ - 复制解码的ffmpeg AVFrame,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38808946/