用树莓派做了一个简单的广告机一看就会的那种
bigegpt 2024-10-10 04:37 5 浏览
项目由来
故事发生在,前不久的一天。下班的时候经过电梯时看到电梯旁边挂着的广告机,播放着熟悉的广告视频,当时就琢磨着这广告机啥原理,怎么工作,当想的差不多的时候就有了想运用自己所学以及现有硬件资源也做一做的想法。于是就有了这次的内容。
项目分解
广告机,在坐公交的时候有看到,坐地铁的时候有看到。广告机现在差不多到处可见。但是基本上它的工作方式都一样,就是不断循环播放着一样的视频或者不一样的图片。于是就清楚大概要怎么做,怎么实现了。
方案选择
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循环播放获取到的视频名->然后就一个大循环就完成。
脚本代码如下:
#!/bin/sh
folder="/media/pi/Advertising" #存放文件的目录
SERVICE="omxplayer" #播放视频的软件
files=$(ls $folder)
while true #死循环全列表播放
do
for file in $files #列表顺序播放
do
echo $file #播放前打印播放的视频名,测试用
$SERVICE $folder/$file >/dev/null #播放视频并把相关软件输出信息扔到无底洞
sleep 5; #视频切换延时
done
done
就这十几行的代码就完成了这个简单的广告机。视频存放目录我设置为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部分的代码不复杂,也不多。各部分的功能就是;
1. 配置窗体的属性,最大化全屏显示并去掉窗体装饰。
2. 先读INI文件,判断之后再写。因为只需要第一次写就好,后面不需要写。因为写的时候如何没有ini文件就会创建文件。
3. 读图片信息。
4. 绘制图片。
5. 执行shell脚本。QT执行shell脚本的方法有几种,分类主要有两种。一种是阻塞性的另一种是非阻塞性。在这次项目,shell脚本是不停循环所以不能使用阻塞性的执行方法。也使用了一些阻塞性的执行方法,一运行整个应用都卡住了。
编译好后把最后生成的可执行文件拿来用就可以。
其实还可以添加很多功能,但是这次没打算花更多的时间在这里,最后达到了自己想要的效果就够了。
最后整个项目的目录就是这样的了:
有几个过程测试文件还保留着,后面回来看的时候还知道自己做过什么事情也是挺好的。
第四步运行测试
昨天弄好后拷贝了几个视频到U盘放在树莓派跑了一个晚上一直到今天都没出现问题,这是最好的结果。
相关推荐
- Go语言泛型-泛型约束与实践(go1.7泛型)
-
来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...
- golang总结(golang实战教程)
-
基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...
- Go 官宣:新版 Protobuf API(go pro版本)
-
原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...
- Golang开发的一些注意事项(一)(golang入门项目)
-
1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...
- golang 托盘菜单应用及打开系统默认浏览器
-
之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...
- golang标准库每日一库之 io/ioutil
-
一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...
- 文件类型更改器——GoLang 中的 CLI 工具
-
我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...
- Go (Golang) 中的 Channels 简介(golang channel长度和容量)
-
这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...
- Golang引入泛型:Go将Interface「」替换为“Any”
-
现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...
- 一文带你看懂Golang最新特性(golang2.0特性)
-
作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...
- Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移
-
以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...
- Golang使用grpc详解(golang gcc)
-
gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...
- Etcd服务注册与发现封装实现--golang
-
服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...
- Golang:将日志以Json格式输出到Kafka
-
在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...
- 如何从 PHP 过渡到 Golang?(php转golang)
-
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- secure-file-priv (67)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)