故事发生在,前不久的一天。下班的时候经过电梯时看到电梯旁边挂着的广告机,播放着熟悉的广告视频,当时就琢磨着这广告机啥原理,怎么工作,当想的差不多的时候就有了想运用自己所学以及现有硬件资源也做一做的想法。于是就有了这次的内容。
项目分解
广告机,在坐公交的时候有看到,坐地铁的时候有看到。广告机现在差不多到处可见。但是基本上它的工作方式都一样,就是不断循环播放着一样的视频或者不一样的图片。于是就清楚大概要怎么做,怎么实现了。
方案选择
1. QT+QMediaPlayer+树莓派4
方案尝试:一开始在ubuntu系统里面跑了一下QMediaPlayer的使用例程,一运行就报很多的错误,基本上都缺少相关的包或组件。把相关的问题解决完后,在ubuntu里面播放视频都正常了,当拿到树莓派系统运行时各种错误和警告同样存在。解决完与ubuntu相似的问题后,还有几个不知道是哪里的警告,各种搜寻一通最后例程可以运行,但是播放视频时时没画面,还报错。最后只能放弃这个方案,找寻其他的方案。
2. QT+VLC-Qt+树莓派4
方案介绍:在找方案的时候有前辈说,播放视频时黑边去不掉。而且需要程序设计比较复杂一些。还有各种文件的移植。所以这个方案也放弃了。
经过一番搜寻,还发现其他几种方案,但是开发起来过程都差不多。还存在很多未知的各种问题需要解决。不过最后应该都可以达到想要的效果。但是我感觉还是不够好,开发起来不够快。
QT+MPlayer
QT+phonon
QT+ffmpeg
QT+OpenCV
3. 经过这番搜寻都没有找到自己想要的,当时就想是不是我搜的姿势不对,不,是关键字不对。于是就查了一下Linux系统下有哪些视频播放软件。这一搜索,突然发现了一个名为"omxplayer"的视频播放软件。试了一下,软件播放视频时默认是全屏播放,于是当时就看上了它。因为这就是我要的。现在还需要的是如何控制它播放。在linux系统下shell脚本是一个不错的选择。所以最后的方案就是:Shell+omxplayer+QT+树莓派4
知道了可行方案下面就可以开始了。
第一步写循环播放脚本
脚本的大概流程就是:从指定目录获取所有视频名->使用omxplayer循环播放获取到的视频名->然后就一个大循环就完成。
脚本代码如下:
就这十几行的代码就完成了这个简单的广告机。视频存放目录我设置为U盘的目录,树莓派插入U盘自动挂载到"/media/pi"目录下。只要把视频拷到U盘就可以。
虽然现在是可以循环播放视频但是在一个视频结束了,另一个视频还没开始的这段时间画面会回到桌面,于是我就想不让别人看到桌面,那我就先打开一张图片全屏显示然后再打开视频循环播放。果然方法可行。
第二步处理视频切换间隔画面显示
方案选择:
1. xdg-open和Gpicview 图片查看软件。这两个软件打开的图片都是一样的效果。打开后需要再次操作才能全屏,没有命令操作方法。全屏效果也不好。
全屏后有黑边,不好。
2. python+PIL模块。跟之前软件打开的差不多不能全屏。
3. Python+tkinter+PIL 。可以全屏显示,但存在的问题就是图片显示了,再打开视频时把视频遮挡了。这不是我要的效果。
4. Python+CV模块。这个也是一种方案,当时没有进行测试,因为想到了一个更好的方案。
5. QT全屏显示图片。
第三步QT小软件开发
QT部分的大概流程:
1. 创建窗体。
2. 在窗体中绘制一张图片。
3. 运行shell脚本。
因为只有一张图片的窗体相关参数没办法设置。所以加入了INI配置文件的读写操作。
完善流程为:
1. 创建窗体。
2. 从ini配置文件读取图片路径和图片名称。
3. 绘制从ini配置文件读取的图片信息的图片。
4. 从ini配置文件读取脚本的相关信息。
5. 执行脚本。
这样的好处就是可以通过修改ini配置文件对QT应用软件进行更改。
QT部分代码如下:
QT部分主要代码
INI文件读写操作函数
QT部分的代码不复杂,也不多。各部分的功能就是;
1. 配置窗体的属性,最大化全屏显示并去掉窗体装饰。
2. 先读INI文件,判断之后再写。因为只需要第一次写就好,后面不需要写。因为写的时候如何没有ini文件就会创建文件。
3. 读图片信息。
4. 绘制图片。
5. 执行shell脚本。QT执行shell脚本的方法有几种,分类主要有两种。一种是阻塞性的另一种是非阻塞性。在这次项目,shell脚本是不停循环所以不能使用阻塞性的执行方法。也使用了一些阻塞性的执行方法,一运行整个应用都卡住了。
编译好后把最后生成的可执行文件拿来用就可以。
其实还可以添加很多功能,但是这次没打算花更多的时间在这里,最后达到了自己想要的效果就够了。
最后整个项目的目录就是这样的了:
有几个过程测试文件还保留着,后面回来看的时候还知道自己做过什么事情也是挺好的。
第四步运行测试
昨天弄好后拷贝了几个视频到U盘放在树莓派跑了一个晚上一直到今天都没出现问题,这是最好的结果。
来源:嵌知百汇