1.     背景介绍

  中控端运行的操作系统是Android,中控软件主要功能有导航、收音机、媒体(音乐)、蓝牙(连接)、手机互联、行车辅助和系统设置等。

  仪表端运行的操作系统是Linux,仪表软件主要功能是将汽车CAN总线数据中有关车速、油量/电量、挡位和里程等信息解析处理并显示到汽车仪表盘上。

  新需求要将中控端导航、媒体(音乐)和蓝牙(连接)的画面投射到仪表端指定区域,并让驾驶员通过方向盘上的按钮来控制两端画面的同步切换。

  在使用开源多媒体框架Gstreamer实现了将中控端投射画面显示到仪表端之后,发现投射的画面出现不同大小的黑色区域(如下图1-1),并且黑色区域没有任何有用内容,为了满足软件开发需求,需要去掉黑色区域。

图1-1

2.     解决思路

Gstreamer实现过程:配置Gstreamer参数到系统的环境变量中,通过Gstreamer的管道将投射接口与QML中显示媒体接口VideoOutput连接起来,就可以实现将中控端投射内容显示到仪表端了。

  1. export QT_GSTREAMER_CAMERABIN_VIDEOSRC=imxv4l2src
  2. export QT_GSTREAMER_CAMERABIN_VIDEOSRC_DEVICE="/dev/video0"

以下是解决实现投屏之后遇到的显示画面中出现的黑色区域问题。

2.1.    让投屏画面显示到QML组件上,再调整组件大小

  主要思想:通过调整加载投屏画面组件sceneLoader的宽高值,使其小于投屏画面本身的宽高值,从而达到显示面积等于有实际内容的投屏画面面积。

  1. //投屏显示
  2. Loader{
  3. id: sceneLoader
  4. x: 1380
  5. y: 230
  6. width: 500
  7. height: 100
  8. scale: 0.7
  9. sourceComponent :undefined
  10. ... ...
  11. }

  结果:失败,投屏画面里面黑色区域随整体画面大小变化而等比例变化。

  其他类似方式,如调整组件sceneLoader所加载资源文件的宽高值;调整投屏画面的缩放值等,都未能解决问题。

2.2.    将每帧投屏画面处理之后,再显示到QML组件上

  主要思想:把接收到的每帧投屏画面在C++代码端进行裁剪处理,再将处理后的每帧画面显示到QML组件上。

  结果:由于裁剪和刷新的效率低,导致画面会出现严重的延迟,最终失败。

2.3.    使用OpacityMask遮罩将画面黑色区域遮住

  主要思想:使用Item元素的OpacityMask属性,将MaskSource画面遮罩在原Source上,最终得到一个以MaskSource形状显示出的部分Source内容的画面。

官方示例如下:

图2.3-1

QML代码:

  1. import QtQuick 2.12
  2. import QtGraphicalEffects 1.12
  3. Item {
  4. width: 300
  5. height: 300
  6. Image {
  7. id: bug
  8. source: "images/bug.jpg"
  9. sourceSize: Qt.size(parent.width, parent.height)
  10. smooth: true
  11. visible: false
  12. }
  13. Image {
  14. id: mask
  15. source: "images/butterfly.png"
  16. sourceSize: Qt.size(parent.width, parent.height)
  17. smooth: true
  18. visible: false
  19. }
  20. OpacityMask {
  21. anchors.fill: bug
  22. source: bug
  23. maskSource: mask
  24. }
  25. }

  思考:看到官方展示的效果之后,我们可不可以用一张和投屏画面(相当于图2.3-1中Source)相同尺寸的MaskSource图片,且将需要去掉的黑色面积部分制作为透明部分。

结果:尝试发现该方法是可行的,下面将用一节来详细介绍解决过程。

3.     使用OpacityMask属性

  按照2.3中的思路,通过和UI工程师沟通之后我们得到下图3-1作为MaskSource,同时将需要处理的图1-1作为Source。

图3-1

部分关键代码如下:

  1. VideoOutput{
  2. id: videoOutput
  3. source: camera
  4. visible: false
  5. Camera{
  6. id: camera
  7. }
  8. }
  9. Image{
  10. id:mask
  11. source: "qrc:/images/mask_picture.png"
  12. visible: false
  13. }
  14. OpacityMask{
  15. id: om
  16. width: 1280
  17. height: 720
  18. source: videoOutput
  19. maskSource: mask
  20. }

最终运行效果如下图3-2:

图3-2

  显示出来的效果像似黑色区域被裁剪掉了一样,如果要对上图3-2画面再做大小上面的调整,就只需要对di为om的对象进行长宽和大小上的缩放即可。

运行过程中可以通过信号触发来更换maskSource,进一步来改变使用遮罩属性后的最终形状。

遗留两点需要补充的地方:

QML - 实现Gstreamer投屏 投屏画面遮挡的更多相关文章

  1. Android 启动APP时黑屏白屏的三个解决方案

    你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...

  2. html5+css3第一屏滚屏动画效果

    详细内容请点击 在线预览立即下载 html5+css3第一屏滚屏动画效果. 转载自:http://tympanus.net/codrops/2014/05/22/inspiration-for-art ...

  3. Android 启动APP时黑屏白屏的三个解决方案(转载)

    你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...

  4. DXGI快速截屏录屏技术

    DXGI快速截屏录屏技术 概述   很多地方都需要用到截屏/录屏技术,比如桌面直播,桌面录制等等.在微软Windows平台,有很多截屏的接口,不过大多数性能并不理想,Windows8以后微软引入了一套 ...

  5. ReactNative 常见红屏黄屏及终端报错

    刚开始接触RN,总是会遇到各种红屏黄屏报错,红屏是fatal error(程序无法正常运行),黄屏是Warming(非致命错误,程序可以运行但是存在潜在问题可能在某些情况下将导致fatal error ...

  6. WPF解决界面全屏化但不遮挡任务栏的问题

    原文:WPF解决界面全屏化但不遮挡任务栏的问题 学习C#有一段时间了,现在跟着做项目,碰到有个客户端界面总是全屏,对于客户来说没有任务栏很不习惯,所以做了些略微的修改   </pre>&l ...

  7. [转]C#API 实现锁屏+关屏

    http://www.cnblogs.com/1971ruru/archive/2010/05/20/1740216.html public Form1( bool aLock ) { if (aLo ...

  8. Android5.0免Root截屏,录屏

    http://blog.csdn.net/wds1181977/article/details/52174840 MediaProjection介绍 MediaProjection可以用来捕捉屏幕,具 ...

  9. 第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片

    1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. 解决 APP启动白屏黑屏问题

    闪屏页简介 闪屏页,我们手机上的每个 APP 几乎都有自己的闪屏页,就是在真正进入程序前,会有一个页面停顿几秒钟.其实我们完全可以充分利用好这几秒钟做很多的程序初始化了启动. 为什么我的 APP 启动 ...

随机推荐

  1. VS插件CodeRush for Visual Studio发布v19.1.5|新的Inline Lambda重构

    CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验.CodeRush能帮助你以极高的效率创建和维护源代码.Consume- ...

  2. HDU-6546-Function(贪心)

    链接: https://vjudge.net/problem/HDU-6546 题意: wls 有 n 个二次函数 Fi(x) = aix2 + bix + ci (1 ≤ i ≤ n). 现在他想在 ...

  3. percona 5.7 + tokudb

    percona 5.7 + tokudb Percona + TokuDB 部署 # 参考资料https://www.kancloud.cn/devops-centos/centos-linux-de ...

  4. 算法——二进制解决N皇后(超级酷炫o((>ω< ))o

    先贴代码: public class Solution { void NQueen(int N, int row, int col, int pie, int na, int[] res) { if ...

  5. 4.瀑布流js

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 上传200G文件

    最近遇见一个需要上传百G大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  7. nowcoder 79F 小H和圣诞树 换根 DP + 根号分治

    设节点个数大于 $\sqrt n$ 的颜色为关键颜色,那么可以证明关键颜色最多有 $\sqrt n$ 个.对于每个关键颜色,暴力预处理出该颜色到查询中另一个颜色的距离和. 对于不是关键颜色的询问,直接 ...

  8. 【Leetcode】二分法

    题目: 在排序数组中查找元素的第一个和最后一个位置. 二分法的思想非常简单,然而其中的实现细节非常繁琐,容易出错.本推文非常详细地介绍二分法的实现细节. 总结几点注意事项: 初始上.下界的取值: 判断 ...

  9. 南昌网络赛 H The Nth Item

    南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化 注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费 #include<bits/stdc++ ...

  10. 6.Python缩进规则(包含快捷键)

    和其它程序设计语言(如 Java.C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次. 在 Python 中,对于类定义.函数定义.流程控制语 ...