MaybeNot 发表于 2024-8-27 16:57:00

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

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

dengkx 发表于 2024-8-27 18:01:50

你需要获取哪个模块处理后的图像数据,那么可以为其设置输出回调函数,模块每处理完一帧就会调用回调将图像传递给你,你可以参考demo_opencv.cpp,他就是通过回调的方式使用图像显示的。

MaybeNot 发表于 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文件句柄,直接操作其中的数据,不知道这样是否可行?

dengkx 发表于 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,不用导出。

MaybeNot 发表于 2024-9-4 11:50:04

dengkx 发表于 2024-9-2 14:48
回调执行的时候,图像已经按照你的设置处理好了,也就是通过getActiveData()和getActiveSize()拿到连续的 ...

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

dengkx 发表于 2024-9-5 10:29:12

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

getActiveData()只是获取videobuffer的内存地址,该videobuffer出了回调就会被模块回收到内存池再次使用,
也就是你只有在回调里才拥有他。如果你需要长久持有并不想拷贝,你可以提前申请一个同样的videobuffer(newModuleMediaBuffer)去与模块从内存池交换(exportUseMediaBuffer)指定videobuffer
页: [1]
查看完整版本: ffmedia如何读取解码/图像转换后帧的数据