复制已解码的ffmpeg AVFrame

时间:2016-08-06 21:39:40

标签: c++ c ffmpeg

我一直试图像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。

2 个答案:

答案 0 :(得分:9)

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

除了分配AVFrame结构并将其初始化为某些默认值之外,

av_frame_alloc不会执行任何操作。最重要的是,它不为帧数据分配缓冲区或准备要使用的帧。 av_frame_copy失败,因为目标帧没有正确的像素格式集或分配的缓冲区。

如果您想要克隆一个框架(通过递增其引用计数器,而不是创建深层副本),您可以使用av_frame_cloneav_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);}