海思的有很好的mpp SDK, 播放视频流的,可以快速的从VDEC(解码)到 VO(显示),但是当我们UI需求比较复杂的时候,需要很多操作界面,比如快进,后退,比如调节摄像头位置等等,这些复杂的UI 功能,我们能想到的使用qt开源的平台的方案实现,但是如果视频在qt界面上播放怎么办呢?VO 是无法嵌入到qt的。我有如下方案:
一,编译支持opengl的qt,用opengl渲染 解码的yuv 或者rgb数据。这里会有一个问题,qt只能访问解码器的虚拟地址,从虚拟地址读取数据yuv 或者rgb的速度是很慢的。测试发现虽然3559可以解码8k视频,但是用虚拟地址读数据,读取1080的yuv或者rgb数据一帧,需要45毫秒。非常耗时。这个方案对分辨率不是很高的播放需求还可以满足。但是对分辨率和帧率高一些的方案无法满足。于是有了方案2.
二,方案二,我们可以不从虚拟地址获取yuv数据,我们直接用物理地址转成opengl的纹理。
1,eglCreateImageKHR 创建用物理地址一个egl 图像。我理解是应该是图像物理地址的一个映射。
2,glEGLImageTargetTexture2DOES ,相当于glTexImage2D函数的作用,把图像贴到纹理上。
在实施过程中,特别注意海思的eglCreateImageKHR 只支持rgba 的格式。Demo里面 关于yuv的根本跑不起来。
方案一图:
方案二图: