草庐IT

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

桃子酱紫君 2023-12-18 原文

目录

引言:小板子能联网还有摄像头,组合起来会怎么样呢?
大体结构: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秒左右。

有关自制Linux功能板-新增功能(基于RTMP流媒体传输协议的视频监控)的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  3. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  4. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  5. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  6. Linux磁盘分区中物理卷(PV)、卷组(VG)、逻辑卷(LV)创建和(LVM)管理 - 2

    文章目录一基础定义二创建逻辑卷2-1准备物理设备2-2创建物理卷2-3创建卷组2-4创建逻辑卷2-5创建文件系统并挂载文件三扩展卷组和缩减卷组3-1准备物理设备3-2创建物理卷3-3扩展卷组3-4查看卷组的详细信息以验证3-5缩减卷组四扩展逻辑卷4-1检查卷组是否有可用的空间4-2扩展逻辑卷4-3扩展文件系统五删除逻辑卷5-1备份数据5-2卸载文件系统5-3删除逻辑卷5-4删除卷组5-5删除物理卷六LVM逻辑卷缩容6-1缩容注意事项6-2标准缩容步骤一基础定义LVM,LogicalVolumeManger,逻辑卷管理,Linux磁盘分区管理的一种机制,建立在硬盘和分区上的一个逻辑层,提高磁盘分

  7. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  8. ruby - 如何在 Ruby 中获取 linux 系统信息 - 2

    如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack

  9. ruby - rbenv:在 Linux Mint 上找不到 gem 命令 - 2

    我在LinuxMint17.2上。我最近使用apt-getpurgeruby​​删除了ruby​​。然后我安装了rbenv然后rbenvinstall2.3.0所以现在,~/.rbenv/versions/2.3.0/bin/ruby存在。但是现在,我无法执行geminstallrubocop。我明白了:$geminstallrubocoprbenv:gem:commandnotfoundThe`gem'commandexistsintheseRubyversions:2.3.0但是我可以~/.rbenv/versions/2.3.0/bin/geminstallrubocop。但是,

  10. ruby - 在 Linux 上编译 Ruby 1.9.2 所需的先决条件? - 2

    我是Ruby和RoR的新手。我有一个带有Ubuntu镜像的干净Linode实例,我想从源代码编译Ruby而不是使用apt-get。我已经在谷歌上搜索了执行此操作的说明,但经过一些尝试后,当我尝试运行一些教程示例时,我不断收到有关缺少zlib和其他一些包的错误。任何人都可以给我详细的说明(或链接),教我如何在从源代码编译Ruby之前安装必要的必备包吗?我的目的是编译Ruby的最新稳定版本,然后安装Rubygems和Rails。提前感谢您的帮助!!! 最佳答案 Thisblogpost涵盖从源代码编译ruby​​所需的包和安装过程;它引

随机推荐