我一直试图像ffmpeg: make a copy from a decoded frame (AVFrame)中回答的那样复制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。
答案 0 :(得分:9)
如果您阅读av_frame_copy
的文档,则说“此函数不分配任何内容,dst必须已经初始化并使用与src相同的参数进行分配。”
AVFrame
结构并将其初始化为某些默认值之外, av_frame_alloc
不会执行任何操作。最重要的是,它不为帧数据分配缓冲区或准备要使用的帧。 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);
请注意,我没有检查我调用的函数中的错误。你应该在真实的代码中做到这一点。为简洁起见,我在此省略了它。
答案 1 :(得分:0)
我在GPU上安装了AVFrame *。这对我有用:
int ret;
AVFrame *dst;
dst = av_frame_alloc();
memcpy(dst,src,sizeof(AVFrame));
dst->format = src->format;
dst->width = src->width;
dst->height = src->height;
dst->channels = src->channels;
dst->channel_layout = src->channel_layout;
dst->nb_samples = src->nb_samples;
dst->extended_data = src->extended_data;
memcpy(dst->data, src->data, sizeof(src->data));
ret = av_frame_copy_props(dst, src);
if (ret < 0) { av_frame_unref(dst);}