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


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

    一、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:跳过汇编
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 修改配置文件 config.mak
    //换成交叉编译器
    CC= arm-linux-gnueabihf-gcc
    LD=arm-linux-gnueabihf-gcc -o
    AR= arm-linux-gnueabihf-ar rc
    RANLIB= arm-linux-gnueabihf-ranlib
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译、安装:

    make
    make install
    
    • 1
    • 2

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

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

    经验:板子的软件资源目录/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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

    make -j4
    make install -j4
    
    • 1
    • 2

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

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

    二、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 用于添加第三方模块
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    安装

    make install
    
    • 1

    移植

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

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

    三、运行测试

    1、启动nginx

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

    在这里插入图片描述
    板子上/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;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    然后重启

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

    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
    
    • 1

    在这里插入图片描述

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

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

    在这里插入图片描述

  • 相关阅读:
    嵌入式面试常见问题(三)
    php代码审计篇熊海cms代码审计
    现代农业信息技术
    【SQL语法基础】使用DDL创建数据库&数据表时需要注意什么?
    谷粒商城 (二十三) --------- 商品服务 API 属性分组 ④ 品牌分类关联与级联更新
    在antd-table新增索引列
    【正点原子STM32连载】 第四十二章 IIC实验 摘自【正点原子】APM32F407最小系统板使用指南
    844. 比较含退格的字符串
    CircRNA+代谢组如何冲击22分高分文章?
    当应酬成为日常,你需要这20个技巧聪明地进食
  • 原文地址:https://blog.csdn.net/qq_41753052/article/details/126414313