1 | 综合篇 | 点我 |
---|---|---|
2 | uboot移植 | 点我 |
3 | uboot lcd驱动 | 点我 |
4 | kernel移植 | 点我 |
5 | kernel lcd驱动 | 点我 |
6 | 摄像头驱动 | 点我 |
7 | ubuntu base移植 | 点我 |
8 | 挂载网络文件系统 | 点我 |
9 | qt移植 | 点我 |
10 | 搭建qt交叉编译 | 点我 |
11 | wifi移植 | 点我 |
12 | 搭建nginx + rtmp服务器 | 点我 |
常见的视频监控和视频直播就是使用 RTMP 和 RTSP 流媒体协议等。
RTSP (Real-Time Stream Protocol)由 Real Networks 和 Netscape 共同提出的,基于文本的多媒体播放控制协议。 RTSP 定义流格式,流数据经由 RTP 传输; RTSP 实时效果非常好,适合视频聊天,视频监控等方向。
RTMP(Real Time Message Protocol) 由 Adobe 公司提出,用来解决多媒体数据传输流的
多路复用(Multiplexing)和分包(packetizing)的问题,优势在于低延迟,稳定性高,支持所有摄像头格式,浏览器加载 flash 插件就可以直接播放。
RTSP 和 RTMP 的区别:
RTSP 虽然实时性最好,但是实现复杂,适合视频聊天和视频监控; RTMP 强在浏览器支持好,加载 flash 插件后就能直接播放,所以非常火,相反在浏览器里播放 rtsp 就很困难了。
本文使用RTMP的方式实现视屏监控
1 准备工作
- 下载nginx源码:wget http://nginx.org/download/nginx-1.20.2.tar.gz
- 下载依赖库libpcre.a源码:wget http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.39.tar.gz
- 下载依赖库libz.a源码: wget https://downloads.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz
- 下载rtmp模块源码:GitHub - arut/nginx-rtmp-module: NGINX-based Media Streaming Server
前三个库源码下载完成后,都进行解压。
2 编译
pcre库和libz库都不用单独编译,在编译nginx时添加模块时一起编译。
2.1 编译nginx-1.20.2
进入nginx-1.20.2
song@song-machine:/home/work/third-party$ cd nginx-1.20.2/
创建安装目录
sudo mkdir arm-nginx
配置
./configure --with-cc=arm-linux-gnueabihf-gcc --with-cpp=arm-linux-gnueabihf-g++ --prefix=/opt/arm-nginx --add-module=/home/work/third-party/nginx-rtmp-module-master --with-http_ssl_module --with-debug --with-pcre=/home/work/third-party/pcre-8.39 --with-zlib=/home/work/third-party/zlib-1.2.11 --with-openssl=/home/work/third-party/openssl-1.1.1d --without-http_upstream_zone_module --without-stream_upstream_zone_module
// --prefix=/opt/arm-nginx 指定安装目录,最后install时生成的程序放在这个目录下,要和开发存放的路径相同
// --add-module=/home/work/third-party/nginx-rtmp-module-master 编译rtmp模块,这个目录是上面下载源码后解压的目录
// --with-pcre=/home/work/third-party/pcre-8.39 编译pcre模块,这个目录是上面下载源码后解压的目录
// --with-zlib=/home/work/third-party/zlib-1.2.11 编译zlib模块,这个目录是上面下载源码后解压的目录
// --with-openssl=/home/work/third-party/openssl-1.1.1d 编译opessl模块
解决办法:
gedit auto/cc/name
将
ngx_feature_run=yes
改为
ngx_feature_run=no
重新执行
./configure --with-cc=arm-linux-gnueabihf-gcc --with-cpp=arm-linux-gnueabihf-g++ --prefix=/opt/arm-nginx --add-module=/home/work/third-party/nginx-rtmp-module-master --with-http_ssl_module --with-debug --with-pcre=/home/work/third-party/pcre-8.39 --with-zlib=/home/work/third-party/zlib-1.2.11 --with-openssl=/home/work/third-party/openssl-1.1.1d --without-http_upstream_zone_module --without-stream_upstream_zone_module
解决办法:
gedit auto/types/sizeof
(1)ngx_test="$CC 改为 ngx_test="gcc
(2)ngx_size=$NGX_AUTOTEST 改为 ngx_size=4
重新执行
./configure --with-cc=arm-linux-gnueabihf-gcc --with-cpp=arm-linux-gnueabihf-g++ --prefix=/opt/arm-nginx --add-module=/home/work/third-party/nginx-rtmp-module-master --with-http_ssl_module --with-debug --with-pcre=/home/work/third-party/pcre-8.39 --with-zlib=/home/work/third-party/zlib-1.2.11 --with-openssl=/home/work/third-party/openssl-1.1.1d --without-http_upstream_zone_module --without-stream_upstream_zone_module
编译
sudo make
解决办法:
打开options
gedit auto/options
将
PCRE_CONF_OPT
修改为
PCRE_CONF_OPT=--host=arm-linux-gnueabihf-gcc //修改为自己的工具链
报错
解决办法:
gedit auto/lib/openssl/make
将
&& ./config --prefix=$ngx_prefix no-shared no-threads $OPENSSL_OPT
改为
&& ./Configure --prefix=$ngx_prefix no-shared no-threads --cross-compile-prefix=arm-linux-gnueabihf- linux-generic32 \\
注意将./config改为./Configure
gedit objs/ngx_auto_config.h
添加
#ifndef NGX_HAVE_SYSVSHM
#define NGX_HAVE_SYSVSHM 1
#endif
安装
sudo make build
安装结果
3 拷贝到armlinux的网络文件系统中
sudo cp /opt/arm-nginx/ ../../imx6ull/rootfs/ubuntu-base-armhf/opt/ -r
将nginx添加到环境变量中
vim /etc/profile
添加
export PATH=$PATH:/opt/arm-nginx/sbin
重新加载环境变量
source /etc/profile
4 运行nginx
直接执行nginx命令
查看本地ip
可以看到开发板wifi的ip是192.168.0.100
在win10 浏览器输入192.168.0.100:80
出现下面结果代表移植成功
5 添加rtmp配置
将下面内容添加到/opt/arm-nginx/conf/nginx.conf中
rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
}
}
}