Firefly开源社区

打印 上一主题 下一主题

[应用开发] ffmedia如何读取解码/图像转换后帧的数据

82

积分

0

威望

0

贡献

技术小白

积分
82

ffmedia如何读取解码/图像转换后帧的数据

发表于 2024-8-27 16:57:00      浏览:530 | 回复:5        打印      只看该作者   [复制链接] 楼主
问题描述及复现步骤:
比如对于一个本地mp4格式的视频文件,使用ffmedia提供的库进行解码并进行缩放和颜色空间转换(假设YUV->RGB)等操作后,能否实时获取到每一帧RGB数据,而不是直接在屏幕上显示。可以通过 'newModuleMediaBuffer' 'exportUseMediaBuffer' 实现吗?导出的数据是实时的吗?

null.zip

150 Bytes, 下载次数: 0, 下载积分: 灯泡 -1 , 经验 -1

回复

使用道具 举报

980

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
980
发表于 2024-8-27 18:01:50        只看该作者  沙发
你需要获取哪个模块处理后的图像数据,那么可以为其设置输出回调函数,模块每处理完一帧就会调用回调将图像传递给你,你可以参考demo_opencv.cpp,他就是通过回调的方式使用图像显示的。
回复

使用道具 举报

82

积分

0

威望

0

贡献

技术小白

积分
82
发表于 2024-8-29 16:25:38        只看该作者  板凳
dengkx 发表于 2024-8-27 18:01
你需要获取哪个模块处理后的图像数据,那么可以为其设置输出回调函数,模块每处理完一帧就会调用回调将图像 ...

感谢回复。看了代码后还有点疑惑:对于rga模块的输出回调传到用户态的buffer,这里的buffer转为VideoBuffer后getActiveData(),再invalidateDrmBuf()后,此时有效地址中存放的是RGB数据吗(前面已设置颜色空间转换)?如果是的话,也就是说不需要通过exportUseMediaBuffer来导出rga模块中的数据,不知道我的理解是否正确。
另外,对于上述方法,似乎速度有点慢(毕竟将数据从dma传到cpu了),如果通过getBufFd()获取drm文件句柄,直接操作其中的数据,不知道这样是否可行?
回复

使用道具 举报

980

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
980
发表于 2024-9-2 14:48:50        只看该作者  地板
MaybeNot 发表于 2024-8-29 16:25
感谢回复。看了代码后还有点疑惑:对于rga模块的输出回调传到用户态的buffer,这里的buffer转为VideoBuff ...

回调执行的时候,图像已经按照你的设置处理好了,也就是通过getActiveData()和getActiveSize()拿到连续的内存,这段内存存放的是处理后的图像数据,可以直接将该内存块转成mat给cv操作。
invalidateDrmBuf()调用只为了把还在cache的数据刷下来,避免遗漏数据,显示图像不完整。
exportUseMediaBuffer:该接口是交换rga内存池,如果你输入buffer为空,他会创建buffer(建议提前创建好buffer用于交换),是为了一些延后处理图像使用的,实时图像处理就直接用回调传递进来的buffer,不用导出。
回复

使用道具 举报

82

积分

0

威望

0

贡献

技术小白

积分
82
发表于 2024-9-4 11:50:04        只看该作者  5#
dengkx 发表于 2024-9-2 14:48
回调执行的时候,图像已经按照你的设置处理好了,也就是通过getActiveData()和getActiveSize()拿到连续的 ...

请问对于getActiveData()得到的数据会在什么时候失效?好像没看到有显式释放的接口,能否延长其生命周期,因为需要将数据存储起来发送到其他设备,如果可以延长生存周期的话似乎可以减少一次memcpy的操作
回复

使用道具 举报

980

积分

0

威望

0

贡献

技术大神

Rank: 3Rank: 3

积分
980
发表于 2024-9-5 10:29:12        只看该作者  6#
MaybeNot 发表于 2024-9-4 11:50
请问对于getActiveData()得到的数据会在什么时候失效?好像没看到有显式释放的接口,能否延长其生命周期 ...

getActiveData()只是获取videobuffer的内存地址,该videobuffer出了回调就会被模块回收到内存池再次使用,
也就是你只有在回调里才拥有他。如果你需要长久持有并不想拷贝,你可以提前申请一个同样的videobuffer(newModuleMediaBuffer)去与模块从内存池交换(exportUseMediaBuffer)指定videobuffer
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表