请先参考上篇文章完成Ubuntu下的RTMP构建,确保在Linux情况下可以运行正常:

【Ubuntu 上搭建 Nginx-RTMP 服务】

源码清单:

标准源码清单如下:

本次只需要用到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

参考链接:

Ubuntu系统使用Nginx搭建RTMP服务器实现推流

搭建RTMP服务器

海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

交叉编译Nginx实现RTMP推流、文件上传

nginx 手动离线安装 及依赖包安装(pcre+zlib+openssl)

交叉编译嵌入式openssl:error: unrecognized command line option ‘-m64‘

openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决

交叉编译Hi3536上面使用的nginx_附一些订正

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐