飞凌嵌入式
直播中

FredSong

7年用户 34经验值
擅长:处理器/DSP
私信 关注
[技术]

【飞凌嵌入式OK527N-C开发板体验】6.制作h264播放器

飞书20240808-231234

demo有提供streamplayer的demo,它使用硬件解码器,考虑它使用的直接显示的方式,计划给它增加一个qt的显示界面,demo中有camera的qt示例,后面考虑次StreamPlayer的图像数据 放到camera的qt示例的qt框中显示,做一个qt的h264播放器。

1.查找streamplayer中的图像输出

查看源码发现这个playr释放出来的只有一个cpp文件,如下图
image.png

阅读代码发现,demo基于AWStreamPlayer实现,开始没有直接跳转,以为这个实现是在so库中,后vscode查找发现它在当前源码中。
image.png

AWStreamPlayer几乎是个纯虚函数,有个静态工厂方法。
image.png

目前示例中只有impl这一个类实现 了这个接口,在creat方法 中直接 构造这个子类。
image.png

AWStreamplayerimpl继承player,实现所有必要的接口。
image.png

在initial()中会创建解码器,以实现 解码。
image.png

在test.c中,在创建了player之后 ,会调用startThread
image.png

startThread中会在完成初始化后,调用StartDecodeThread()

image.png

它会创建一个执行VDecordThread的线程
image.png

数据解码后使用showPicture_DE的函数显示图片。

image.png

查找camerademo中显示图像的接口

下面查找qt_camera应用中的图像显示接口,主函数中创建camera,并show,它是这个qt应用的主元件。

image.png

class定义中看到了showImage的接口

image.png

showimage已被 注释,且看图像类型是RGB888,可能有图像转换的需求 啊,不妙。

image.png

重新查找正确的图像显示方式,在StartWorkThread中有看到capture,这是从usb相机接收图片的实例。查找它caputure到的图像去哪儿 了,哪儿 应该就是显示 。
image.png

这里发现了格式转换和Qimage的设值。

image.png

2.组合qt的h264播放器

重新恢复camera模块的showimage接口,看来原来程序员大哥是想把camera传递给capture的,不知为何后来又决定只传递label,不甚严谨。

修改callback实现,将成员变量修改为Camera,这样在callback中就可以 showimage了。
image.png

在main函数中创建thread,将解码的线程创建在这里,使用lambda实现解码流程。

image.png

qt的编译环境不太熟悉,这里有点奇怪,在sdk_lib中有各个文件,这里提示找不到类的定义,明明在qt editor中都 可以 跳转,编译就是报找不到定义,查找了qt的配置,根本没有找到依赖库的配置位置,不过从生成的makefile中能看到sdk_lib的配置。

image.png

调试

缺少的so库查找发现在sysroot中,只是没有包含进工程中,可以使用下面的命令添加so库
image.png

添加成功后如下图所示,这里除了依赖解码,还依赖了log
image.png

编译成功后上板运行打印如下,发现解码器加载时会提示缺少一些插件,不过 不影响 当前的264解码
image.png

最后qt中的解码播放器视频放置在开头了,代码放附件中*附件:qt_player.rar
不让上传 tar.gz的格式 ,临时修改为rar了,解压前自行换回

更多回帖

发帖
×
20
完善资料,
赚取积分