嵌入式Qt-FFmpeg设计一个RTSP播放器
上篇文章,介绍了FFmpeg的交叉编译,以及在嵌入式Linux平台,运行ffmpeg指令来播放视频。
本篇,将通过Qt程序,设计一个RTSP视频播放器,来播放网络视频,并增加启动、暂停等操作按钮。
1 FFMPEG 库介绍
1.1 ffmpeg的7个库ffmpeg有7个library,分别是:
avutil
swscale
swresample
avcodec
avformat
avdevice
avfilter
avutil 工具库avutil是一个实用的工具库用于辅助可移植的多媒体编程。它包含安全的可移植的字符串函数,随机数生成器,数据结构,附加的数学函数,密码学和多媒体相关功能(例如像素和样本格式的枚举)。它不是 libavcodec 和 libavformat 都需要的代码库。
swscale 视频像素数据格式转换swscale库执行高度优化的图像缩放以及色彩空间和像素格式转换操作,这个库执行以下转换:
Recailing:是改变视频大小的过程。 有几个重新缩放选项和算法可用。 这通常是一个有损过程。
Pixel format conversion:是将图像的图像格式和 ...
嵌入式Qt-交叉编译FFmpeg与视频播放测试
想要在Linux板子上通过Qt界面来播放视频,一种可选的方式是调用FFmpeg库来实现视频的解码与播放。本篇先来进行FFmpeg库的交叉编译,将FFmpeg库移植到Linux板子上。
1 交叉编译FFmpegFFmpeg需要用到x264库,需要先编译这个库。
1.1 编译x264官网http://www.videolan.org/developers/x264.html下载x264的源码
然后解压,并进行配置
12345#解压tar -xvf x264-master.tar.bz2#进入源码目录, 进行配置./configure --enable-shared --enable-static --host=arm-linux-gnueabihf --cross-prefix=arm-linux-gnueabihf- --disable-opencl --enable-pic --disable-asm --prefix=$PWD/_install
一些参数说明:
–host=arm-linux-gnueabihf :指定交叉编译链
–enable-shared :允许共享
...
嵌入式Qt-简易网络监控摄像头
本编利用Qt实现一个网络摄像头功能,包含一个服务端和一个客户端,服务端用于将USB摄像头转换为一个IP摄像头,当有客户端连接时,将其捕获到的图像通过TCP发送出去;客户端运行在Linux板子上,用于查看摄像头的实时画面。
1 必备基础知识本篇需要编写一个服务器和客户端,关于TCP服务器/客户端的基础知识,可参考这篇:Linux进程间通信详解(七) socket套接字基础
注意,Qt中对Socket的操作进行了进一步的封装,其基本思想还是一样的。
下面就来看一下Qt中如何实现TCP Socket通信。
1.1 QTcpSocket与QTcpServer
QTcpSocket,在Qt中,Socket被封装成了QTcpSocket,可以用它实现TCP客户端的功能,以及服务端接收到客户端后,对客户端的处理。
QTcpServer,对于TCP服务端的功能,可以使用QTcpServer来完成。
这里整理Qt中TCP Socket的使用方法,配合Qt的信号与槽机制,即可实现服务端/客户端数据的收发处理。
1.2 QCamera相关
QCamer,获取当前系统可用的摄像头 类似获取串口
QC ...
嵌入式Qt-控制硬件-滑动条控制RGB灯
前面的几篇文章,介绍Qt例程,都是和硬件无关的,Windows平台和嵌入式平台都能运行。
本篇,来测试一下Qt界面控制嵌入式平台上的硬件,以野火i.MX6ULL板子上的RGB LED为例,实现Qt界面控制3种颜色LED的不同亮度混合显示。
1 设计Qt滑条控制LED界面先来看一下最终设计的界面效果:
有一个按键作为LED的总开关,控制LED的点亮与熄灭。下面的3个滑条,控制3种颜色LED以不同的亮度点亮。右边是一个颜色混合显示面板,模拟RGB三种颜色的LED以不同亮度点亮后的混合亮度。
1.1 滑条控件Qt Creator的UI设置界面中,有水平滑条和竖直滑条控件,可以直接使用:
右侧的属性窗户可以设置滑条的取值范围和初始值。
1.2 控件颜色使用QPalette可以对界面颜色和控件的颜色进行自定义设置
QPalete::Window——通常指窗口部件的背景色
QPalette::WindowText——通常指窗口不见的前景色
QPalette::Base——底色
QPalette::Button——指按钮窗口部件的背景色
QPalette::ButtonText——指按钮窗口部 ...
嵌入式Qt-实现两个窗口的切换
之前的文章,分别有介绍过使用Qt程序实现一个时钟和一个秒表,本篇,来将这两个功能整合在一起,实现两个页面的随意切换,并且两个页面能独立运行,互不影响。
先来看下最终的效果,通过左侧的两个按钮,实现两个页面的切换。
1 Qt堆栈窗口本篇的页面切换功能,是利用Qt的QStackedWidget实现的。
1.1QStackedWidgetQStackedWidget 类提供了多页面切换的布局,一次只能显示一个界面。
1.2 基础模板对于QStackedWidget的使用,可以先参考下面这个模板,配合QLabel来控制页面的切换:
1234567891011121314151617181920212223242526272829303132#include "stackdlg.h"#include <QHBoxLayout>StackDlg::StackDlg(QWidget *parent) : QDialog(parent){ setWindowTitle(tr("StackedWidget")); list ...
嵌入式Qt-做一个秒表
之前的文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序
介绍了如何编写第一个嵌入式Qt程序,实现了一个电子时钟的演示。
本篇,继续进行Qt实践,仿照手机中的秒表,实现一个相同功能的秒表:
回顾上一次的Qt开发流程,整个Qt的开发都是通过敲代码实现的,实际上,还可以利用Qt Creater的UI界面功能,通过图像化的配置来开发图形界面,本篇就使用这种方法来进行开发。
1 新建Qt工程Qt工程创建的具体步骤可参照之前的文章:嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序,这里只说明不同之处。
上篇是通过代码实现页面设计的,本篇要借助Qt Creater的UI界面设计功能,因此要把下面的创建页面勾选上:
创建完成之后的Qt默认工程结构如下:
双击widget.ui,即可打开UI设置页面,如下图:
这里先简单熟悉下各个功能区:
2 代码编写2.1 ui界面设计修改界面的尺寸,我的Linux板子屏幕的分辨率是800x480,因此调整到对应的尺寸:
从左侧拖入一个Label,然后可以修改字体的大小:
再从左侧拖入其它需要用到的组件(PushButton、TextB ...
嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序
上篇文章:嵌入式Linux-Qt环境搭建
介绍了如何搭建在Linux开发板中搭建Qt的运行环境,并测试了Qt自带的例程。
本篇,来介绍如何自己编写一个Qt程序,并将编译结果放到Linux开发板中运行。
1 Windows上编写Qt程序因为Qt是支持跨平台的,所以我们可以先在Windows平台上编写和查看Qt的运行效果,然后再通过交叉编译,编译出ARM Linux平台的可执行文件,最终放到开发板中查看运行结果。
Windows上需要安装Qt Creator软件来开发Qt程序,该软件的安装过程,和大多数软件的安装过程都差不多,在此不再演示安装过程。
下面介绍如何创建一个Qt工程。
1.1 新建Qt工程Qt Creator本质也是一个集成开发环境,与Visual Studio之类的创建工程的流程类似,其软件界面如下:
创建工程,选择左上角菜单中的“文件”->”新建文件或项目”,弹出如下窗口,然后默认选择Qt Widgets Application,然后右下加点击“Choose”按键:
出现选择项目工程的存放位置,然后再下一步:
这里会用到Visual Studio中的一些功能,默 ...
STM32状态机编程实例--全自动洗衣机(下)
上篇文章,通过状态机编程,实现了全自动洗衣机的逻辑控制,并通过串口打印的方式显示各个状态。
本篇,为了更加直观的感受状态机的运行,使用0.96寸OLED来显示各个状态,并搭配对应的动态图标来体现洗衣机工作的各个状态。
先来看下演示效果:
1 OLED图片显示为了能方便的在OLED上显示文字和图片,可以借助一些图形库来帮我们显示,这里使用的是U8g2图形库。
1.1 U8g2库移植U8g2库在STM32上的移植,之前的文章已经介绍过,具体的移植过程可以参考这篇:
移植成功后,可以使用测试例程验证U8g2库的显示效果。
1.2 图片显示图片相比较文字,可以展示更加丰富的内容,因此本篇通过简单的单色图片来展示洗衣机的工作状态。
U8g2库显示图片,可以使用u8g2_DrawXBM函数,需要先将图片转为数组。
可以使用这个在线网页来进行图片数据的转换:https://tools.clz.me/image-to-bitmap-array
这里可以使用自己喜欢的图片,进行展示,比如我选取了不同水量的洗衣机图标来显示洗衣机的当前水量,使用多张图片的交替显示产生洗衣机在清洗的动画效果。
2 ...
STM32状态机编程实例--全自动洗衣机(上)
前面几篇文章,以按键功能,介绍了状态机的原理与按键状态机实例,实现按键单击、双击、长按等状态的检测。
本篇,继续使用状态机编程,来实现一个更有趣的功能——全自动洗衣机。
1 全自动洗衣机功能分析下面是一个全自动洗衣机的控制面板:
面板上有4个按键:
电源:控制洗衣机通电与断电
水位:选择洗衣时需要的水位,有1~8个水位
程序:选择不同的洗衣模式,有1~10个模式
01:标准
02:轻柔
03:快速
…
10:桶风干
启动/暂停:用于启动或暂停洗衣任务
面板上还有一个数码管,用于显示当前的工作状态与剩余时间,可显示的工作模式有:
AA:浸泡
BB:洗涤
CC:漂洗
DD:脱水
本篇,就按照这款洗衣机的操作方式实现对应的洗衣机控制逻辑。需注意的是:
实际的洗衣机有水位检测传感器,本篇中,暂用时间延时模拟水位的增加,且默认开机时水位为0
实际的洗衣机中的洗衣模式,会根据不同的模式自动设置清洗次数与每次清洗的时间以及清洗力度,本篇为了简化起见,清洗模式的设置仅用于区分不同的清洗次数
某些特殊的清洗模式,如单独的脱水,桶风干等,本篇暂不实现
对于状态的显示 ,本篇先以串口打印的实 ...
STM32按键状态机3--增加双击与功能优化
上篇文章,介绍了将按键检测增加长按功能,并将按下抖动与松开抖动共用一个抖动状态来表示,其状态图如下:
仔细研究这个状态图,其它还存在一些问题:
短按状态,只要按下去,不需要等按键再释放,就会触发短按事件。对于需要按下再松开作为一次短按的应用来说,此状态图也不满足需求
长按状态,必须先经过短按状态,即长按按键,会先触发一个短按,再触发一个长按。如果实际应用中需要分别使用短按和长按,则此状态图不满足要求
本篇,就来解决上述两个问题,并再增加一个按键双击检测,实现一个功能更全面的按键检测。
1 增加双击检测增加一个双击检测,需要增加两个状态:
等待再次按下
确认第2次按下
同时,之前的“短按状态”和“长按状态”分别改为“确认按下”和“确认长按”。
1.1 状态图修改修改后的状态图如下,有以下几点需要注意: ...