Firefly开源社区

标题: ffmedia如何读取解码/图像转换后帧的数据 [打印本页]

作者: MaybeNot    时间: 2024-8-27 16:57
标题: ffmedia如何读取解码/图像转换后帧的数据
比如对于一个本地mp4格式的视频文件,使用ffmedia提供的库进行解码并进行缩放和颜色空间转换(假设YUV->RGB)等操作后,能否实时获取到每一帧RGB数据,而不是直接在屏幕上显示。可以通过 'newModuleMediaBuffer' 'exportUseMediaBuffer' 实现吗?导出的数据是实时的吗?tchip_askquestions

null.zip

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


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

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

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

请问对于getActiveData()得到的数据会在什么时候失效?好像没看到有显式释放的接口,能否延长其生命周期,因为需要将数据存储起来发送到其他设备,如果可以延长生存周期的话似乎可以减少一次memcpy的操作
作者: dengkx    时间: 2024-9-5 10:29
MaybeNot 发表于 2024-9-4 11:50
请问对于getActiveData()得到的数据会在什么时候失效?好像没看到有显式释放的接口,能否延长其生命周期 ...

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




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1