一起用代码吸猫!本文正在参与【喵星人征文活动】
一、前言介绍
说起养宠物,已经在现在社会上一种常态,当我们在生活节奏和压力日益加速的时候,养一只宠物,不仅为生活带来了许多欢乐,更给予无法替代的温暖陪伴。
一个不喜欢社交的人,在与他人相处的时候可能感到不安,但他可以在自己的宠物身上获得那种最纯粹的爱与陪伴,宠物不会对人的价值或道德做出评价,它们的陪伴是无条件的。
在工作了一天以后还想到家里还有一个小生命在家里等着你,就感觉自己一天的疲劳都消失了,又有了奋斗的力量。
为了能够实时了解两只小家伙每天在家的活动情况,决定自己搭建一个远程视频监控平台,刚好手上也有闲着的硬件设备。
大概实现的流程是: 本地客户端设备采用ffmpge将本地摄像头、声卡数据编码后,采用rtmp协议推流到服务器,然后手机或者电脑APP拉流显示,完成监控的流程。
二、推流端: 开发过程
2.1 硬件介绍
开发板使用的树莓派4B,淘宝官方店购买的,树莓派的板载硬件资源、软件资源都比较齐全,环境都是现成,拿到板子就可以直接开始开发。
树莓派4B支持windows远程桌面连接,开发起来非常方便:
2.2 搭建开发环境
因为音视频编码推流用到了ffmpge,在写代码之前先将要用到的库编译好,树莓派因为系统里有编译器,资源都是齐全的,相当于就是一台微型电脑,不需要采用交叉编译这种形式。
下面是编译ffmpge源码要用到的库
编译ffmpeg:
1 | cpp复制代码sudo apt-get install libomxil-bellagio-dev |
2.4 设计的客户端推流代码: 树莓派上运行
下面贴出了完整的代码,所有功能都在这个.c 文件里。编译的时候指定自己的ffmpge库位置,因为用到了线程、和alsa-lib库,需要指定相应的库。
gcc编译的代码参数如下:
1 | cpp复制代码gcc ffmpeg_encode_video_audio.c -I /home/ffmpeg-4.2.2/_install/include -L /home/ffmpeg-4.2.2/_install/lib -lavcodec -lavfilter -lavutil -lswresample -lavdevice -lavformat -lpostproc -lswscale -L/home//_install/lib -lx264 -lm -lpthread -lasound |
代码整体分为3个部分:
(1). 摄像头采集部分: 摄像头采用的是标准USB免驱摄像头,支持Linux下标准V4L2框架。
(2). 声卡采集部分: 声卡采用alsa-lib库读取声卡的内容。
(3). 视频编码推流部分: 采用ffmpge接口实现。
1 | cpp复制代码#include <stdlib.h> |
三、服务器端: 开发过程
服务器端使用的阿里云服务器,安装ubuntu18.04系统,使用Nginx搭建Rtmp流媒体服务器。
下面是搭建Nginx服务器需要用到的安装包:
1 | cpp复制代码xl@xl:~/work_pc$ mkdir nginx |
编译安装nginx:
1 | cpp复制代码$ cd nginx-1.8.1/ |
控制服务器的3个常用指令
1 | cpp复制代码sudo service nginx start |
编辑/usr/local/nginx/conf/nginx.conf文件,加入RTMP的配置
1 | cpp复制代码rtmp { |
里面8888是设置的端口,可以自己设置,要保证不能被其他进程占用了,设置完启动服务器即可。 下面然后下面就编写拉流的播放器,查看树莓派推流过来的画面。
四、客户端: 播放器开发过程
播放器端可以直接使用现成的软件,也可以自己开发。
自己开发的话,可以直接使用ffmpeg接口开发,或者使用现成的封装好的框架,libvlc、QTAV等等。
因为我的客户端软件准备采用QT框架开发,我这里就采用QTAV来实现流媒体视频的播放,比较省事,跨平台编译也很方便。
QTAV的官网: www.qtav.org/
前面文章里也介绍了QTAV的编译安装方法: juejin.cn/post/702554…
运行效果如下:
4.1 widget.cpp 代码
1 | cpp复制代码MainWindow::MainWindow(QWidget *parent) |
4.2 widget.h 代码
1 | cpp复制代码#include <QMainWindow> |
本文转载自: 掘金