demo有提供streamplayer的demo,它使用硬件解码器,考虑它使用的直接显示的方式,计划给它增加一个qt的显示界面,demo中有camera的qt示例,后面考虑次StreamPlayer的图像数据 放到camera的qt示例的qt框中显示,做一个qt的h264播放器。
查看源码发现这个playr释放出来的只有一个cpp文件,如下图
阅读代码发现,demo基于AWStreamPlayer实现,开始没有直接跳转,以为这个实现是在so库中,后vscode查找发现它在当前源码中。
AWStreamPlayer几乎是个纯虚函数,有个静态工厂方法。
目前示例中只有impl这一个类实现 了这个接口,在creat方法 中直接 构造这个子类。
AWStreamplayerimpl继承player,实现所有必要的接口。
在initial()中会创建解码器,以实现 解码。
在test.c中,在创建了player之后 ,会调用startThread
startThread中会在完成初始化后,调用StartDecodeThread()
它会创建一个执行VDecordThread的线程
数据解码后使用showPicture_DE的函数显示图片。
下面查找qt_camera应用中的图像显示接口,主函数中创建camera,并show,它是这个qt应用的主元件。
class定义中看到了showImage的接口
showimage已被 注释,且看图像类型是RGB888,可能有图像转换的需求 啊,不妙。
重新查找正确的图像显示方式,在StartWorkThread中有看到capture,这是从usb相机接收图片的实例。查找它caputure到的图像去哪儿 了,哪儿 应该就是显示 。
这里发现了格式转换和Qimage的设值。
重新恢复camera模块的showimage接口,看来原来程序员大哥是想把camera传递给capture的,不知为何后来又决定只传递label,不甚严谨。
修改callback实现,将成员变量修改为Camera,这样在callback中就可以 showimage了。
在main函数中创建thread,将解码的线程创建在这里,使用lambda实现解码流程。
qt的编译环境不太熟悉,这里有点奇怪,在sdk_lib中有各个文件,这里提示找不到类的定义,明明在qt editor中都 可以 跳转,编译就是报找不到定义,查找了qt的配置,根本没有找到依赖库的配置位置,不过从生成的makefile中能看到sdk_lib的配置。
缺少的so库查找发现在sysroot中,只是没有包含进工程中,可以使用下面的命令添加so库
添加成功后如下图所示,这里除了依赖解码,还依赖了log
编译成功后上板运行打印如下,发现解码器加载时会提示缺少一些插件,不过 不影响 当前的264解码
最后qt中的解码播放器视频放置在开头了,代码放附件中*附件:qt_player.rar
不让上传 tar.gz的格式 ,临时修改为rar了,解压前自行换回
更多回帖