引言:小板子能联网还有摄像头,组合起来会怎么样呢?
大体结构:v4l2的摄像头=>ffmpeg的视频流=>基于nginx的RTMP流媒体服务器=>客户端接收视频流
(v4l2在初始文章已完成了驱动,后期只需调用/dev/video1设备)
参考博文:博文
ffmpeg
(fast forward moving picture expert group),是一套可以用来记录
、转换数字音频、视频格式
,并能将其转化为流
的开源计算机程序
。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库
libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
所谓封装格式
是指音视频的组合格式,例如最常见的封装格式有mp4、mp3、flv
等。简单来说,我们平时接触到的带有后缀的音视频文件都是一种封装格式。不同的封装格式遵循不同的协议标准。
视频的编码格式为YUV420P
,音频的编码格式为PCM
。以此进行相应的音视频压缩,不做深究。
参考博文:iTOP-iMX6ULL 开发板-FFmpeg 移植实现视频采集
网上的参考一般移植ffmpeg时都会带上x264库,
视频编码器
,将数据
(例如YUV420P)编码成一种h.264标准的视频流
(ES流)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:跳过汇编
//换成交叉编译器
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
( Real Time Message Protocol),实时消息流媒体传输协议
,用来解决多媒体数据传输流
的多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式
,浏览器加载 flash 插件就可以直接播放。
这里使用 Nginx 来搭建 RTMP 流媒体服务器,如果有时间,可以在一台公网 IP 主机上搭建流媒体服务器(需要内网穿透)。
源码:哈哈,自己网上搜去吧,或者原子应用开发文档里有连接。
解压:略
配置:
//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 文件,将 15、 43行处的” 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。安装之后虽然有警告,但是能正常运行。
板子上./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
板子服务器端
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秒左右。