C++ 复制解码的ffmpeg AVFrame

C++ 复制解码的ffmpeg AVFrame,c++,c,ffmpeg,C++,C,Ffmpeg,我一直在试图复制一个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 fai

我一直在试图复制一个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);
}
AVFrame*copyFrame=NULL;
copyFrame=av_frame_alloc();
int return\u code=av\u frame\u copy(复制帧、原始帧);
如果(返回_代码<0){
fprintf(标准,“av\U帧复制失败,返回代码%d\n”,返回代码);
申报表(1);
}

如果有帮助,我从av_frame_copy获得的返回码是-22。

如果您阅读了的文档,它会说“此函数不分配任何内容,dst必须已经初始化,并使用与src相同的参数进行分配。”

除了分配
AVFrame
struct并将其初始化为一些默认值之外,不执行任何操作。最重要的是,它不会为帧数据分配缓冲区或准备要使用的帧<代码>av_帧_复制失败,因为目标帧未设置正确的像素格式或未分配缓冲区

如果要克隆帧(通过增加其引用计数器,而不是创建深度副本),可以使用或

如果要移动框架,可以使用

但你可能想做一个适当的深度复制。在这种情况下,您可以查看的源代码。如果帧不可写,此函数将生成帧的深度副本,因此我们可以使用相同的逻辑在此处生成帧的深度副本:

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);

注意,我没有检查我调用的函数中是否有错误。您应该在实际代码中这样做。为了简洁起见,我省略了它。

我在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);}
int-ret;
AVFrame*dst;
dst=av_帧_alloc();
memcpy(dst、src、sizeof(AVFrame));
dst->format=src->format;
dst->宽度=src->宽度;
dst->高度=src->高度;
dst->channels=src->channels;
dst->channel_layout=src->channel_layout;
dst->nb_样本=src->nb_样本;
dst->extended_data=src->extended_data;
memcpy(dst->data,src->data,sizeof(src->data));
ret=影音帧复制道具(dst、src);
if(ret<0){av_frame_unref(dst);}

Error-22似乎意味着您的一个参数无效,谢谢。我阅读了文档,但一直在学习如何使用av_frame_get_buffer()。我主要从事脚本语言的工作,但我目前正在努力学习C语言。感谢您的耐心。正是“int align”参数让我感到不舒服,因为我不知道align应该是什么。很高兴它很有用!对齐方式取决于您正在做的事情,尽管32对齐方式是相当安全的,并且应该适用于您正在做的任何事情。某些CPU指令,特别是优化例程中使用的高级SIMD指令,需要特定的对齐方式。您可能可以使用1的对齐方式,但除非您知道如何使用对齐方式,否则我建议使用32。文档还有一些细节。我认为这不会稳定工作,因为dst中的数据没有分配,也没有深度复制
memcpy(dst->data,src->data,sizeof(src->data))只复制数据指针。这样,dst->data==src->data