C++ &引用;不透明;ffmpeg AVFrame中的指针

C++ &引用;不透明;ffmpeg AVFrame中的指针,c++,ffmpeg,libav,C++,Ffmpeg,Libav,在ffmpeg中,有一个描述解码视频或音频数据的结构 它有一个空指针不透明。该文档声称这是“针对用户的某些私人数据” 这是什么意思? 它可以用于根据帧元数据传输任何附加数据吗?它是一个专用于用户(与ffmpeg库相反)使用的字段;ffmpeg将不会以任何方式触及此字段,因此您可以根据需要自由使用它。不过有一个警告:一些ffmpeg函数将复制AVFrame(或者可能将引用从AVFrame移动到另一个AVFrame),其中包括复制此字段的值。管理此字段所指向的数据的生命周期可能有点棘手 如果您只需要

ffmpeg
中,有一个描述解码视频或音频数据的结构

它有一个空指针
不透明
。该文档声称这是“针对用户的某些私人数据”

这是什么意思?
它可以用于根据帧元数据传输任何附加数据吗?

它是一个专用于用户(与ffmpeg库相反)使用的字段;ffmpeg将不会以任何方式触及此字段,因此您可以根据需要自由使用它。不过有一个警告:一些ffmpeg函数将复制AVFrame(或者可能将引用从AVFrame移动到另一个AVFrame),其中包括复制此字段的值。管理此字段所指向的数据的生命周期可能有点棘手


如果您只需要处理一些每帧元数据,您可能需要考虑在AVFrAME中可用的现有元数据存储(参见<代码> avyFraskGETByItase/AvFrimeStudioMeta >)/P> < P>这是一个专用于用户的字段(而不是FFMPEG库)使用;ffmpeg将不会以任何方式触及此字段,因此您可以根据需要自由使用它。不过有一个警告:一些ffmpeg函数将复制AVFrame(或者可能将引用从AVFrame移动到另一个AVFrame),其中包括复制此字段的值。管理此字段所指向的数据的生命周期可能有点棘手


如果您只需要处理一些每帧元数据,您可能需要考虑在AVFrAME中可用的现有元数据存储(参见<代码> avyFraskGETByItgs/AvFrimeStudioMeta >

< P>,在Andrey Turkin所说的扩展一点,其目的是向AVFrror结构添加特定于应用程序的对象数据。具体的用例通常是应用程序分配内存(使用回调)时。这个内存可能只是一个指针,但有时也可能是GPU中的内存或类似的东西。无论如何,如果应用程序拥有数据并创建与分配的内存/图片缓冲区相关联的对象,则当解码器在
avcodec\u decode\u video2()
函数中返回给定的AVFrame时,它通常希望访问相关联的对象,这就是您通常希望使用不透明字段的目的。

要稍微扩展一下@Andrey Turkin所说的内容,目的是将特定于应用程序的对象数据添加到AVFrame结构中。具体的用例通常是应用程序分配内存(使用回调)时。这个内存可能只是一个指针,但有时也可能是GPU中的内存或类似的东西。无论如何,如果应用程序拥有数据并创建与分配的内存/图片缓冲区相关联的对象,则当解码器在
avcodec\u decode\u video2()
函数中返回给定的AVFrame时,它通常希望访问相关联的对象,这就是您通常希望使用不透明字段的原因。

现在,对于这些用例,通常会在AVBuffer中使用不透明字段(可能还有其他字段),而不是在AVFrame中使用不透明字段。因此,如果我理解正确的话:在编码视频数据时,
不透明
指向的任何用户数据都不会显示在结果文件/流中?是。ffmpeg不会读取或写入该字段,除了在创建帧时将其设置为NULL,并在复制帧时复制其值之外。现在,对于这些用例,通常会在AVBuffer中使用不透明字段(可能还有其他字段),而不是在AVFrame中使用。因此,如果我理解正确的话:在编码视频数据时,
不透明
指向的任何用户数据都不会显示在结果文件/流中?是。ffmpeg不会读取或写入该字段,除非设置在创建帧时将其设置为NULL,并在复制帧时复制其值。您能否对使用
av\u frame\u get\u metadata
/
av\u frame\u set\u metadata
的假定设置发表意见?它似乎不存在于
libav
version 6:9.18-0ubuntu0.14.04中。1@R2-D2你给它加了标签,并在标题中提到了它,但是。我可能错了,但我认为Libav fork没有
av\u frame\u set\u元数据
;或者至少你正在使用的古老的源代码可能没有;最近的libav版本有一些可以用来做类似事情的辅助数据。更重要的是,libavv9太旧了,它没有元数据或辅助数据,甚至没有缓冲区引用。它是pre-refcounted frames API,这意味着使用
不透明
更容易,因为您可以将元数据生存期与AVFrame生存期链接起来。这也是您在这个libav版本中的唯一选择。我有一个简单的av_frame_get_metadata/av_frame_set_metadata示例。您能否对使用
av_frame_get_metadata
/
av_frame_set_metadata
的假定设置发表意见?它似乎不存在于
libav
version 6:9.18-0ubuntu0.14.04中。1@R2-D2你给它加了标签,并在标题中提到了它,但是。我可能错了,但我认为Libav fork没有
av\u frame\u set\u元数据
;或者至少你正在使用的古老的源代码可能没有;最近的libav版本有一些可以用来做类似事情的辅助数据。更重要的是,libavv9太旧了,它没有元数据或辅助数据,甚至没有缓冲区引用。它是pre-refcounted frames API,这意味着使用
不透明
更容易,因为您可以将元数据生存期与AVFrame生存期链接起来。这也是您在这个libav版本中的唯一选择。我有一个简单的av_frame_get_metadata/av_frame_set_metadata示例。