DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

我一直在尝试复制一个 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 之外不做任何事情struct 并将其初始化为一些默认值。最重要的是,它不会为帧数据分配缓冲区或准备要使用的帧。 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);
posted on   DoubleLi  阅读(1717)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2017-02-15 Linux下读写寄存器
点击右上角即可分享
微信分享提示