QML - 实现Gstreamer投屏 投屏画面遮挡
1. 背景介绍
中控端运行的操作系统是Android,中控软件主要功能有导航、收音机、媒体(音乐)、蓝牙(连接)、手机互联、行车辅助和系统设置等。
仪表端运行的操作系统是Linux,仪表软件主要功能是将汽车CAN总线数据中有关车速、油量/电量、挡位和里程等信息解析处理并显示到汽车仪表盘上。
新需求要将中控端导航、媒体(音乐)和蓝牙(连接)的画面投射到仪表端指定区域,并让驾驶员通过方向盘上的按钮来控制两端画面的同步切换。
在使用开源多媒体框架Gstreamer实现了将中控端投射画面显示到仪表端之后,发现投射的画面出现不同大小的黑色区域(如下图1-1),并且黑色区域没有任何有用内容,为了满足软件开发需求,需要去掉黑色区域。
图1-1
2. 解决思路
Gstreamer实现过程:配置Gstreamer参数到系统的环境变量中,通过Gstreamer的管道将投射接口与QML中显示媒体接口VideoOutput连接起来,就可以实现将中控端投射内容显示到仪表端了。
- export QT_GSTREAMER_CAMERABIN_VIDEOSRC=imxv4l2src
- export QT_GSTREAMER_CAMERABIN_VIDEOSRC_DEVICE="/dev/video0"
以下是解决实现投屏之后遇到的显示画面中出现的黑色区域问题。
2.1. 让投屏画面显示到QML组件上,再调整组件大小
主要思想:通过调整加载投屏画面组件sceneLoader的宽高值,使其小于投屏画面本身的宽高值,从而达到显示面积等于有实际内容的投屏画面面积。
- //投屏显示
- Loader{
- id: sceneLoader
- x: 1380
- y: 230
- width: 500
- height: 100
- scale: 0.7
- sourceComponent :undefined
- ... ...
- }
结果:失败,投屏画面里面黑色区域随整体画面大小变化而等比例变化。
其他类似方式,如调整组件sceneLoader所加载资源文件的宽高值;调整投屏画面的缩放值等,都未能解决问题。
2.2. 将每帧投屏画面处理之后,再显示到QML组件上
主要思想:把接收到的每帧投屏画面在C++代码端进行裁剪处理,再将处理后的每帧画面显示到QML组件上。
结果:由于裁剪和刷新的效率低,导致画面会出现严重的延迟,最终失败。
2.3. 使用OpacityMask遮罩将画面黑色区域遮住
主要思想:使用Item元素的OpacityMask属性,将MaskSource画面遮罩在原Source上,最终得到一个以MaskSource形状显示出的部分Source内容的画面。
官方示例如下:
图2.3-1
QML代码:
- import QtQuick 2.12
- import QtGraphicalEffects 1.12
- Item {
- width: 300
- height: 300
- Image {
- id: bug
- source: "images/bug.jpg"
- sourceSize: Qt.size(parent.width, parent.height)
- smooth: true
- visible: false
- }
- Image {
- id: mask
- source: "images/butterfly.png"
- sourceSize: Qt.size(parent.width, parent.height)
- smooth: true
- visible: false
- }
- OpacityMask {
- anchors.fill: bug
- source: bug
- maskSource: mask
- }
- }
思考:看到官方展示的效果之后,我们可不可以用一张和投屏画面(相当于图2.3-1中Source)相同尺寸的MaskSource图片,且将需要去掉的黑色面积部分制作为透明部分。
结果:尝试发现该方法是可行的,下面将用一节来详细介绍解决过程。
3. 使用OpacityMask属性
按照2.3中的思路,通过和UI工程师沟通之后我们得到下图3-1作为MaskSource,同时将需要处理的图1-1作为Source。
图3-1
部分关键代码如下:
- VideoOutput{
- id: videoOutput
- source: camera
- visible: false
- Camera{
- id: camera
- }
- }
- Image{
- id:mask
- source: "qrc:/images/mask_picture.png"
- visible: false
- }
- OpacityMask{
- id: om
- width: 1280
- height: 720
- source: videoOutput
- maskSource: mask
- }
最终运行效果如下图3-2:
图3-2
显示出来的效果像似黑色区域被裁剪掉了一样,如果要对上图3-2画面再做大小上面的调整,就只需要对di为om的对象进行长宽和大小上的缩放即可。
运行过程中可以通过信号触发来更换maskSource,进一步来改变使用遮罩属性后的最终形状。
遗留两点需要补充的地方:
QML - 实现Gstreamer投屏 投屏画面遮挡的更多相关文章
- Android 启动APP时黑屏白屏的三个解决方案
你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...
- html5+css3第一屏滚屏动画效果
详细内容请点击 在线预览立即下载 html5+css3第一屏滚屏动画效果. 转载自:http://tympanus.net/codrops/2014/05/22/inspiration-for-art ...
- Android 启动APP时黑屏白屏的三个解决方案(转载)
你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...
- DXGI快速截屏录屏技术
DXGI快速截屏录屏技术 概述 很多地方都需要用到截屏/录屏技术,比如桌面直播,桌面录制等等.在微软Windows平台,有很多截屏的接口,不过大多数性能并不理想,Windows8以后微软引入了一套 ...
- ReactNative 常见红屏黄屏及终端报错
刚开始接触RN,总是会遇到各种红屏黄屏报错,红屏是fatal error(程序无法正常运行),黄屏是Warming(非致命错误,程序可以运行但是存在潜在问题可能在某些情况下将导致fatal error ...
- WPF解决界面全屏化但不遮挡任务栏的问题
原文:WPF解决界面全屏化但不遮挡任务栏的问题 学习C#有一段时间了,现在跟着做项目,碰到有个客户端界面总是全屏,对于客户来说没有任务栏很不习惯,所以做了些略微的修改 </pre>&l ...
- [转]C#API 实现锁屏+关屏
http://www.cnblogs.com/1971ruru/archive/2010/05/20/1740216.html public Form1( bool aLock ) { if (aLo ...
- Android5.0免Root截屏,录屏
http://blog.csdn.net/wds1181977/article/details/52174840 MediaProjection介绍 MediaProjection可以用来捕捉屏幕,具 ...
- 第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片
1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- 解决 APP启动白屏黑屏问题
闪屏页简介 闪屏页,我们手机上的每个 APP 几乎都有自己的闪屏页,就是在真正进入程序前,会有一个页面停顿几秒钟.其实我们完全可以充分利用好这几秒钟做很多的程序初始化了启动. 为什么我的 APP 启动 ...
随机推荐
- Python之模块和包补充
包的补充 1.包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间 2.常见目录结构 1 import os 2 os.makedirs('glance/api') 3 os.maked ...
- 【leetcode】Sliding Puzzle
题目如下: On a 2x3 board, there are 5 tiles represented by the integers 1 through 5, and an empty square ...
- jquery 3.1 tets
r.extend = r.fn.extend = function () { var a, b, c, d, e, f, g = arguments[0] || {}, h = 1, i = argu ...
- HDU 6656 Kejin Player
hdu题面 Time limit 5000 ms Memory limit 524288 kB OS Windows 解题思路 因为升级只能一级一级地升,所以所求期望满足了区间加的性质,可以一级一级地 ...
- Android学习笔记之Menu的ShowAsAction属性的设置
(1)在res--menu目录下的main.xml文件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- vuex上手文章参考
参考文章: vue-vuex上手
- SQL语法——Join详解
一.INNER JOIN 用法: select column_name(s) from table 1 INNER JOIN table 2 ON table 1.column_name=table ...
- sublime text3安装格式化代码插件
1.代码提示插件:sublimeCodeIntel a)在Sublime Text 3中,按下Ctrl+Shift+P调出命令面板;b)输入install 调出 Install Package 选项并 ...
- 前端面试题-CSS选择器
一.CSS选择器作用 CSS 选择器用于定位我们想要给予样式的 HTML 元素,但不只是在 CSS 中,JavaScript 对 CSS 的选择器也是支持的,比如 document.document. ...
- centos64位编译32位程序
test.c #include <stdio.h> int main() { printf("sizeof long is %d\n",sizeof(long)); ; ...