【交叉编译nginx移植到开发板, 并使用FFmpeg推流拉流】
·
本章目录:
请先参考上篇文章完成Ubuntu下的RTMP构建,确保在Linux情况下可以运行正常:
源码清单:
标准源码清单如下:

本次只需要用到rtmp部分,裁剪后清单如下:
注意:此处是我个人选择的版本,具体版本可在链接中自行下载;
| 软件名称 | 下载链接 | 个人选择版本 | 描述 |
|---|---|---|---|
| Nginx | http://nginx.org/en/download.html | nginx-1.21.6.tar.gz | 一个高性能的HTTP和反向代理服务器。 |
| Pcre | https://sourceforge.net/projects/pcre/files/pcre/8.45/ | pcre-8.45.tar.gz | 一个正则表达式库。(必须) |
| Zlib | http://www.zlib.net/ | zlib-1.3.1.tar.gz | 一个开源的数据压缩库,提供了对数据的无损压缩和解压功能。(必须) |
| Openssl | https://www.openssl.org/source/ | openssl-1.1.0l.tar.gz | 一个开源的加密库,提供了各种加密算法和安全协议的实现。(必须) |
| RTMP | https://github.com/arut/nginx-rtmp-module/archive/master.zip | master版本 | Nginx 的第三方模块,支持RTMP协议(RTMP必须) |
下载解压后的目录结构如下
togevision@TG:~/wzt/my_nginx_rtmp$ tree -L 1
.
├── install-arm32
├── master.zip
├── nginx-1.21.6
├── nginx-1.21.6.tar.gz
├── nginx-rtmp-module-master
├── openssl-1.1.0l
├── openssl-1.1.0l.tar.gz
├── pcre-8.45
├── pcre-8.45.tar.gz
├── zlib-1.3.1
└── zlib-1.3.1.tar.gz
6 directories, 5 files
togevision@TG:~/wzt/my_nginx_rtmp$
注意此处的
install-arm32目录是用来存放nginx的编译输出,后续需要拷贝此目录到开发板
下载解压后,进入nginx中编译,命令如下:
cd nginx-1.21.6/
# export CC=arm-linux-gnueabihf-gcc
# NGX_PLATFORM=arm32
./configure --with-cc=arm-linux-gnueabihf-gcc --with-cpp=arm-linux-gnueabihf-g++ --with-openssl=../openssl-1.1.0l --with-zlib=../zlib-1.3.1 --with-pcre=../pcre-8.45 --prefix=/home/togevision/wzt/my_nginx_rtmp/install-arm32 --without-http_upstream_zone_module --without-stream_upstream_zone_module --add-module=../nginx-rtmp-module-master
make -j4 && make install
注意: 此处编译链,读者应修改为自己的编译链,下方某些编译链相关的地方也要一起修改;
交叉编译踩坑修改如下:
踩坑1:交叉编译后的程序无法直接检测执行,修改如下:

踩坑2: ngx_size=4是目标机器为32位情况时的设值。如果是64位,要改为

踩坑3:make编译pcre提示没有设置交叉编译链:

注意:此处若修改编译链,需要一起修改;
踩坑4:提示未定义函数:

在configure的时候加上
--without-http_upstream_zone_module --without-stream_upstream_zone_module
踩坑5: no-asm 去除默认的汇编加速, 并设置交叉编译链


注意:此处若修改编译链,需要一起修改;
踩坑6:报错提示缺少函数,添加宏:
方法1:nginx-1.21.6/objs/ngx_auto_config.h 中添加宏:
#ifndef NGX_HAVE_SYSVSHM
#define NGX_HAVE_SYSVSHM 1
#endif
注意: 此处的修改时在objs目录中,如果使用make clean会删除该目录,需要再次添加,后期可使用shell脚本
方法2:修改 NGX_HAVE_SYSVSHM 下方的 ngx_feature_run为no, 看有些教程是修改为yes

编译成功:


nginx.conf文件末尾添加rtmp配置
注意:本次工程仅用到rtmp,最好清空没有用到的http配置,否则可能会引起其它错误;
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
准备RTMP的测试应用:(先确保linux下x86版本可行)
源代码请参考上篇 【Ubuntu 上搭建 Nginx-RTMP 服务】
测试demo目录结构如下:
togevision@TG:~/wzt/av/rtmp_demo$ tree -L 2
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── rtmp_demo
├── CMakeLists.txt
├── ffmpeg
│ ├── include
│ ├── lib
│ └── Makefile
├── ffmpeg_x86
│ ├── inc
│ └── lib
├── main.cpp
└── res
└── video.mp4
9 directories, 8 files
注意:源码中的res目录下的video.mp4和 ip地址都需要随着开发板一起相应更改
修改编译链和对应的FFMPEG库,CMake中修改后进行编译:
cmake_minimum_required(VERSION 3.10)
project(FFmpegRTMPStreaming)
# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
SET(CMAKE_CXX_COMPILER "/home/togevision/toolchain/arm-AX620E-linux-uclibcgnueabihf/bin/arm-AX620E-linux-uclibcgnueabihf-g++")
# 指定头文件和库文件的路径
# include_directories(${CMAKE_SOURCE_DIR}/ffmpeg_x86/inc)
# link_directories(${CMAKE_SOURCE_DIR}/ffmpeg_x86/lib)
include_directories(${CMAKE_SOURCE_DIR}/ffmpeg/include)
link_directories(${CMAKE_SOURCE_DIR}/ffmpeg/lib/arm/uclibc)
# 添加可执行文件
add_executable(rtmp_demo main.cpp)
# 链接FFmpeg库
target_link_libraries(rtmp_demo avformat avcodec avutil swresample)
# 执行之前需要指定动态库路径:
# export LD_LIBRARY_PATH=/home/togevision/wzt/av/rtmp_demo/lib:$LD_LIBRARY_PATH
拷贝开发板执行测试:
拷贝nginx输出目录到开发板执行:
# 添加环境变量,路径可按情况更改:
export PATH=$PATH:/mnt/tfcard/rtmp_nginx_test/install-arm32/sbin/
# 使用 -c 指定配置文件路径, 否则执行默认路径的配置文件
# nginx -c ../nginx.conf
# 执行nginx并指定目录:
nginx -p /mnt/tfcard/rtmp_nginx_test
拷贝测试rtmp_demo和依赖的FFMPEG库、播放的视频等:
# 指定FFmpeg库路径:
export LD_LIBRARY_PATH=/mnt/tfcard/rtmp_nginx_test/ffmpeg/lib/arm/uclibc:$LD_LIBRARY_PATH
# 执行demo
./rtmp_demo
Windows下,打开cmd或powershell使用命令播放:
# 使用ffplay拉流播放
ffplay.exe rtmp://192.168.1.113:1935/live/1
参考链接:
海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)
nginx 手动离线安装 及依赖包安装(pcre+zlib+openssl)
交叉编译嵌入式openssl:error: unrecognized command line option ‘-m64‘
更多推荐

所有评论(0)