使用树莓派实现(山寨)高清视频叠加(HDMI OSD)
项目需要在HDMI上叠加一些字符包括汉字和数值,要求不能使用台式机,本身也没有HDMI采集卡驱动开发能力,所以通过海思的HDMI编码器将HDMI编码为h.264网络视频流,然后通过树莓派解码显示,做字符叠加(OSD),将树莓派的HDMI输出接在电视上,就实现了HDMI的高清视频字符叠加。
1、中文字符问题
opencv实现中文字符显示需要依赖freetype,所以这里简单的加载一张图像模板,opencv在模板上添加数字,汉字部分不需要动在模板中写好即可。
2、树莓派串口问题
首先read的时候报错:
device reports readiness to read but returned no data (device disconnected?)
然后重新打开,报错:
Could not configure port: (5, 'Input/output error')
用minicom打开正常,再用程序打开也正常
整个系统经常假死,ssh无法连接,已经连接的终端不断开,但无法操作,鼠标能移动,但界面无反应。软件停止运行,但有时视频能正常播放。
将树莓派的硬件串口引出后,问题解决。
3、视频显示问题
一开始使用nanopi-M1,但播放视频时发现卡顿严重,1080p仅能播放14帧每秒。使用OpenCV-Python直接打开rtsp流,进行叠加显示,结果卡顿严重,基本上全是绿屏。CPU占用率单核100%,说明opencv使用软解,无法达到实时。
通过ffmpeg播放rtsp流,效果一样。通过ffmpeg播放时,解码部分是硬解,但转码部分没有优化,导致CPU占用达到100%,不能流畅播放。
通过mplayer指定解码器播放视频文件流畅,CPU占用30%,所以应该是用GPU解码的:
mplayer rtsp://192.168.1.90:554/ -vo vdpau -vc ffh264vdpau
使用mplayer播放rtsp时,CPU占用率低,但播放不流畅。怀疑是mplayer的rtsp部分有问题,现在也没有解决。
所以用树莓派继续尝试。
在树莓派3上使用omxplayer直接播放rtsp视频:
omxplayer --avdict rtsp_transport:tcp rtsp://192.168.1.90:554/
但延时高。而且也没有找到方法做osd。所以找了这个链接:https://github.com/AndrewFromMelbourne/raspidmx,用这里边的例子pngview实现了PNG图像在显示器上透明显示,一边用omxplayer播放rtsp视频,一边用opencv绘制PNG图像,再通过pngview画到显示器上,就实现了视频osd功能。
单张PNG叠加实现后,将pngview编译成动态库,由Python调用,但叠加几次以后黑屏,无法解决。所以pngview仍然作为独立进程使用,Python 调用opencv在PNG模板上绘制数字,保存在内存文件系统/tmp下,然后调用pngview显示,启动pngview后,延时50ms杀死上次启动的pngview,防止闪屏。
内存文件系统:
在/etc/fstab中加入一行:
none /tmp tmpfs default 0 0
或者在/etc/rc.local中加入
mount tmpfs /tmp -t tmpfs -o size=128m
注:size=128m 表示/tmp最大能用128m
不管哪种方式,只要linux重启,/tmp下的文件全部消失
这样就实现了HDMI视频osd功能。效果如下:

4、显示分辨率问题
解决视频显示以后,本以为就完成了。但是断电重新开机时,发现屏幕分辨率不对。
1、使用显示器直接连接树莓派,显示器先上电,树莓派再上电,分辨率1280*720,一切正常
2、使用显示器直接连接树莓派,显示器稍晚1s上电,树莓派不启动图形界面,显示器上显示无信号
3、使用以色列图传连接树莓派,同时上电时,显示分辨率变为640*480,无法改变
4、使用以色列图传连接树莓派,图传上电以后树莓派上电,显示分辨率为1920*1080,无法改变,视频正常播放,osd正常叠加,但视频和osd一起运行,屏幕花屏,然后黑屏。截掉任意一个程序,恢复正常。
问题无法解决,所以开机时检测屏幕分辨率,若分辨率不对,就重启,由于分辨率问题是树莓派与显示器一起上电导致的,所以重启后分辨率就对了,就形成了以上的第四种情况,然后又接了一个HDMI双路视频切换的盒子,这个切换盒与树莓派同时上电可以获得正确的分辨率,于是问题解决了……
所以系统拓扑如下……

由于不具备全系统开发能力,无法提高系统集成度,只能依靠买来的模块攒,最终无法做出稳定可靠的东西
使用树莓派实现(山寨)高清视频叠加(HDMI OSD)的更多相关文章
- 树莓派B+上手小记--使用HDMI线连接显示器
入手还算比较顺利,一开始使用网上下的别人精简的OS,发现ACT及PWR灯一直亮着,上网查说用HDMI连接显示器需要修改配置文件config.txt,但修改后情况依旧. 如果还是用官方的系统试试吧,上网 ...
- 【转】绝对不要在树莓派上使用无源的HDMI→VGA视频转换器
http://www.guokr.com/post/521521/ 树莓派由于BCM2835的限制,仅有HDMI和复合视频两种输出形式.所以对于使用VGA显示器的广大用户,HDMI转VGA转换器就成了 ...
- VGA DVI HDMI区别
VGA,DVI,HDMI是目前常用的3种不同显示接口的名称.在树莓派的边缘既有HDMI的接口,也有RCA的接口,而显示器上也是既有DVI,又有VGA.上个月买连接线,没有仔细检查买了一根HDMI对VG ...
- 树莓派3b入门教程
原文地址:传送门 这篇教程将带您一起玩转树莓派3(Raspberry Pi 3).和普通PC一样,拿到新设备第一件事就是要给它安装一个操作系统,并做一些初始化的操作.比PC简单的是,树莓派是一个固定配 ...
- 树莓派(Rospberry Pi B+)到货亲测
1 图鉴 Rospberry Pi B+终于在今天下午有蜗牛快递公司圆*送到了.B+主要是增加了2个USB,增加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 整 ...
- 树莓派(Rospberry Pi B+)到货亲測
1 图鉴 Rospberry Pi B+最终在今天下午有蜗牛快递公司圆*送到了.B+主要是添加了2个USB,添加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 w ...
- 树莓派+Android Things
在开始之前 谷歌前不久发布了Android Things面向物联网的系统,用意是想让android开发者用原来开发app的方式开发硬件相关的应用,扩展了android开发的方向和前景,而谷歌的Andr ...
- [树莓派(raspberry pi)] 01、在linux环境下给树莓派安装系统及入门各种资料
1.预准备 进入帮助页面https://www.raspberrypi.org/help/,可以直接看到GET START WITH PASPBERRY PI,点击进入: 接下来会引导你检查配件是否齐 ...
- SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04
摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...
随机推荐
- 通过 openURL 方法跳转至设置 - iOS
iOS 10 以下系统版本可以通过 openURL 的方式跳转至指定的设置界面,code 如下: NSURL *url = [NSURL URLWithString:@"prefs:root ...
- CSS、JavaScript学习过程
初学JavaScript,通过博客记录自己学习过程中遇到的问题.(包含少量CSS) 零碎记录 JavaScript 输出 type="text/javascript" 那些老旧的实 ...
- 洛谷P4525 【模板】自适应辛普森法1(simpson积分)
题目描述 计算积分 结果保留至小数点后6位. 数据保证计算过程中分母不为0且积分能够收敛. 输入输出格式 输入格式: 一行,包含6个实数a,b,c,d,L,R 输出格式: 一行,积分值,保留至小数点后 ...
- 复习宝典之SpringMVC
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第七章:SpringMVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(co ...
- Spring + Mybatis应该如何配置
### 1. MYBATIS简介 MYBATIS是持久层框架,大大的简化了持久层开发. 当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执行的 ...
- Spring Boot 多环境部署
再简单的应用系统,通常都有两个环境——开发环境和线上环境.大型的企业应用还会有更多的环境,比如测试环境.准线上环境.演示环境等.应用的版本也可能对应了多个环境,比如1.0版本的演示环境.2.0版本的演 ...
- QQ好友的价值玩法 及如何搞到几万好友?
我们知道,现在的自媒体平台太多了.微信公众号,企鹅媒体平台,今日头条.搜狐.UC.一点等等等. 但是现在的话最主要的就是盈利,我们很多朋友玩自媒体这个在很多平台都有自己的账号和大量的粉丝.但是,最后大 ...
- Hive(8)-常用查询函数
一. 空字段赋值 1. 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value).它的功能是如果value为NULL,则NVL函数返回default_v ...
- python和java,php,c,c#,c++的对比
1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.C++在这方面做了改进,在保 ...
- 动态的GRE OVER IPSEC的实验模拟与分析
此篇博客正在介绍的是下图中的Dynamic P2P GRE OVER IPSEC VPN: 为什么出现这种动态的GRE OVER IPSEC VPN技术呢? 首先在前面几篇博客中已经介绍过了,动态是为 ...