自制Linux功能板-新增功能(基于RTMP流媒体传输协议的视频监控)

引言:小板子能联网还有摄像头,组合起来会怎么样呢?
大体结构:v4l2的摄像头=>ffmpeg的视频流=>基于nginx的RTMP流媒体服务器=>客户端接收视频流
(v4l2在初始文章已完成了驱动,后期只需调用/dev/video1设备)

一、ffmpeg工具

1、简介

参考博文:博文
ffmpeg(fast forward moving picture expert group),是一套可以用来记录转换数字音频、视频格式,并能将其转化为的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

所谓封装格式是指音视频的组合格式,例如最常见的封装格式有mp4、mp3、flv等。简单来说,我们平时接触到的带有后缀的音视频文件都是一种封装格式。不同的封装格式遵循不同的协议标准。

视频的编码格式为YUV420P,音频的编码格式为PCM。以此进行相应的音视频压缩,不做深究。

2、移植相关库

参考博文:iTOP-iMX6ULL 开发板-FFmpeg 移植实现视频采集

网上的参考一般移植ffmpeg时都会带上x264库,

  • x264是一种视频编码器,将数据(例如YUV420P)编码成一种h.264标准的视频流(ES流)
  • ffmpeg自带h264解码功能,带上x264就完美了。

2.1 x264移植
源码:x264-master.tar.bz2
解压:略
配置:

  • 目录下
./configure --enable-shared --prefix=${
    
    PWD}/install --host=arm-linux-gnueabihf --disable-asm
//注释
--prefix:指定安装目录
--host:指定交差编译器
--enable-shared:允许共享
--disable-asm:跳过汇编
  • 修改配置文件 config.mak
//换成交叉编译器
CC= arm-linux-gnueabihf-gcc
LD=arm-linux-gnueabihf-gcc -o
AR= arm-linux-gnueabihf-ar rc
RANLIB= arm-linux-gnueabihf-ranlib

编译、安装:

make
make install

移植:
安装后输出文件在install目录下,将

xxx/bin/x264->板子/usr/bin
xxx/lib/xx.so.**(动态链接库)->板子/usr/lib
//测试,(提前chmod 755)
./x264 -h

经验:板子的软件资源目录/usr下的bin和lib专门用于用户自己手动移植的库,好像系统能让可执行文件bin找到lib下属于自己的库,并且让可执行文件拥有全局环境变量。

2.2 ffmpeg移植
源码:ffmpeg-snapshot.tar.bz2
解压:略
配置:这个配置比较麻烦,在网上找了一通,终于配置好了。

//添加刚刚的x264相关库的环境变量
export PKG_CONFIG_PATH=/home/alientek/rtmp/x264-master/install/lib/pkgconfig
//然后再配置,添加了最后一句pkg-config --static,就不会报错说找不到目标文件了
./configure \
--cross-prefix=arm-linux-gnueabihf- \
--enable-cross-compile \
--target-os=linux \
--cc=arm-linux-gnueabihf-gcc --arch=arm --prefix=${
    
    PWD}/install --enable-shared \
--disable-static \
--enable-gpl \
--enable-nonfree \
--disable-ffplay \
--enable-swscale \
--enable-pthreads \
--disable-x86asm \
--disable-stripping --enable-libx264 --enable-decoder=h264 --enable-parser=h264 --enable-demuxer=h264 \
--extra-cflags=-I/home/alientek/rtmp/x264-master/install/include \
--extra-ldflags=-L/home/alientek/rtmp/x264-master/install/lib --extra-libs=-ldl \
--pkg-config="pkg-config --static"

编译、安装:这是个大工程,分线程编译吧,节约时间。

make -j4
make install -j4

移植:
安装后输出文件在install目录下,将

xxx/bin/ffmpeg->板子/usr/bin
xxx/lib/xx.so.**(动态链接库)->板子/usr/lib
//测试,(提前chmod 755)
./ffmpeg -h

二、RTMP的nginx服务器

1、简介

RTMP( Real Time Message Protocol),实时消息流媒体传输协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,浏览器加载 flash 插件就可以直接播放。

这里使用 Nginx 来搭建 RTMP 流媒体服务器,如果有时间,可以在一台公网 IP 主机上搭建流媒体服务器(需要内网穿透)。

2、移植

源码:哈哈,自己网上搜去吧,或者原子应用开发文档里有连接。

  • nginx-1.20.0.tar.gz
  • nginx-rtmp-module 模块(原生的 Nginx 并不支持 RTMP, 我们需要安装第三方模块)

解压:略
配置

//1、临时使用这种交叉编译环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
//2、简单修改
//xxx/auto/cc/name 文件,将 21 行处的”exit 1”给注释掉!
//auto/types/sizeof 文件,将 1543行处的” ngx_size=”修改为” ngx_size=4”,并且将 36 行处的”$CC”修改为”gcc”
//3、配置命令
/configure --prefix=${
    
    PWD}/install \
--with-http_ssl_module \
--with-http_mp4_module \
--with-http_v2_module \
--without-http_upstream_zone_module \
--add-module=/home/dt/tools/nginx-rtmp-module
//--add-module 用于添加第三方模块

配置时会出现缺少相关库的问题,就是下图,那几个库,整的人很难受,缺那个就用命令安装或者自己编译安装。
在这里插入图片描述
编译

make
//正常会出错, xxx/objs/ngx_auto_config.h 文件第3行添加
#ifndef NGX_HAVE_SYSVSHM
#define NGX_HAVE_SYSVSHM 1
#endif
//然后再编译即可

安装

make install

移植

 install/所有目录->板子/etc/nginx/目录下,作为nginx的配置担当
 install/sbin/nginx->自己喜欢的位置,如家目录。
 file nginx可以查看当前执行文件的相关属性(运行平台,版本等)
 板子上ldd nginx可查看文件关联的链接文件
 ./nginx -V用于测试是否成功,提前chmod 755

遇到的问题:在板子上测试失败,原因是openssl的版本不对,需要的时1.0.2d,板子上的时1.0.2g,导致执行文件读取/lib/arm-linux-gnueabihf/下的openssl相关库文件失败。
解决方法:自己把板子上的openssl版本重新安装了1.0.2d。安装之后虽然有警告,但是能正常运行。

三、运行测试

1、启动nginx

板子上./nginx -p /etc/nginx
客户端浏览器:输入局域网ip可看到欢迎界面,说明建立连接成功。

在这里插入图片描述
板子上/etc/nginx/conf/nginx.conf配置添加项,添加到events{}后边:

rtmp {
    
    
	server {
    
    
		listen 1935; # 监听 1935 端口
		chunk_size 4096;
		application live{
    
    
		allow publish 127.0.0.1;
		allow play all;
		live on; # 打开直播
		record off; # 关闭 record
		meta copy;
		}
		application hls {
    
    
		live on;
		hls on;
		hls_path /tmp/hls;
		hls_fragment 8s;
		}
	}
}

然后重启

./nginx -p /etc/nginx -s reload

2、使用 FFmpeg 推流

板子服务器端
ffmpeg程序负责将视频推流,到nginx的rtmp流媒体服务器。

ffmpeg -f v4l2 -video_size 320x240 -framerate 15 -i /dev/video1 -q 10 -f flv rtmp://127.0.0.1/live/mytest

在这里插入图片描述

客户端
安装VLC 软件从服务器进行拉流下载地址

“媒体” —>“打开网络串流” ,结果如下图。目前仅能用于局域网的视频监控,将来可内网穿透使用公网访问。另外,这个小板子Cotex-A7架构,属于中低端的也没有硬件编码,所以视频流传输的延时有5秒左右。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41753052/article/details/126414313