在根目录下供应了一个 Makefile 与一些 源文件。这里的源文件将会编译出一系列的可实行文件。然后我们需 要的并不是可实行文件,真正的对 RTMP 的实现都在 librtmp 子目录中。 在这个子目录中同样包含了一个 Makefile 文件。通过阅读 创造,它的源码并不多: OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o 。因此我们 不进行预编译,即直接放入 AS 中借助 CMakeLists.txt 来进行编译。 这么做可以让我们方便的对库本身进行调试或 修正(实际上我们确实会轻微修正这个库的源码)。 在 AS 中复制 librtmp 置于: ,并为其编写 CMakeLists.txt
# 预编译宏set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO" )# 所有源文件放入 rtmp_source 变量file(GLOB rtmp_source .c)# 编译静态库add_library(rtmp STATIC ${rtmp_source} )
在 中导入这个 CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)# 导 入 其 他 目 录cmakelist add_subdirectory(src/main/cpp/librtmp) add_library(XXX SHARED ...)#XXX须要链接rtmp库target_link_libraries(XXX rtmp ...)
C++音视频开拓学习资料:点击领取→音视频开拓(资料文档+视频教程+口试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

RTMP 视频流格式与 FLV 很相似,通过查看 FLV 的格式文档,就能够知道 RTMP 视频数据该当怎么拼接。
RTMP 中的数据便是由 FLV 的 TAG 中的数据区构成。
FLV tags 构造
如上图,第一个字节 0x09 表示此段数据为视频,数据大小为 0x00,0x00,0x2F 即 47,韶光戳为 0x00,0x00,0x00,韶光戳扩展也为 0x00。(第二行)流 ID:0x00,0x00,0x00。接下来便是视频数据,通过此处的 数据大小字段得知,数据长为 47 字节。 则从 0x17 开始,一贯到末了一行的 0xC0,便是数据区域,而末了的 0x00,0x00,0x00,0x3A 即 58,表示的是这个数据块除末了 4 个字节的总大小。本处为视频数据,那么从 0x17 开始,数据内容则为下面的部分。
视频数据AVCVIDEOPACKET视频数据中 0x17 则表示了 1:关键帧与 7:高等视频编码 AVC,如果是普通帧,则此数据为 0x27。而类型为: 0x00 表示这段数据为 AVC 序列头(avc sequence header)。末了三个字节为合成韶光。而如果类型为 AVC 序列 头接下来的数据便是下面的内容:
C++音视频开拓学习资料:点击领取→音视频开拓(资料文档+视频教程+口试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
AVC 序列头
在 AVCVIDEOPACKET 中如果类型为 0,则后续数据为:
0x01 为版本,后续数据按照上表记录,末了四字节上面说过:为这个数据块除末了 4 个字节的总大小。个中 SPS 与 PPS 是编码器在编码 H.264 视频时,在关键帧前会编码出的关于这个关键帧与须要参考该关键帧的 B/P 帧如何解码的内容,如:宽、高档信息。
其他一样平常情形下,组装的 RTMPPacket(RTMPDump 中的构造体)为:
这里的 sps 与 pps 表示 AVC 序列头
以是对付视频的数据封装,AVC 序列头为:
H.264 数据
H.264 码流在网络中传输时实际因此 NALU 的形式进行传输的。 NALU 便是 NAL UNIT,NAL 单元。 NAL 全称 Network Abstract Layer, 即网络抽象层。在 H.264/AVC 视频编码标准中,全体系统框架被分为了两个层面:视频编码层面 (VCL)和网络抽象层面(NAL)。 个中,前者卖力有效表示视频数据的内容,而后者则卖力格式化数据并供应头 信息,以担保数据适宜各种信道和存储介质上的传输。 我们平时的每帧数据便是一个 NAL 单元。 往 RTMP 包中添补的便是 NAL 数据,但不是直接将编码出来的数据添补进去。 一段包含了 N 个图像的 H.264 裸数据,每个 NAL 之间由: 00 00 00 01 或者 00 00 01 进行分割。 在分割符之后的第一个字节,便是表示这个 nal 的类型。
0x67:sps0x68: pps0x65: IDR 在将数据加入 RTMPPacket 的时候是须要去除分割符的。以是完全的封包代码为:
NALU
NALU 便是 NAL UNIT,nal 单元。NAL 全称 Network Abstract Layer, 即网络抽象层,H.264 在网络上传输的构造。一 帧图片经由 H.264 编码器之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,便是 NALU 了 。
C++音视频开拓学习资料:点击领取→音视频开拓(资料文档+视频教程+口试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
音频数据RTMP 的音频数据相对视频比较大略,只须要根据是否为音频 audio specific config(记录音频的格式)。如果为 audio specific config 拼接 0xAF,0x00,否则就只须要添加 0xAF,0x00。
0xAF 的由来:
我们的编码为:
10:AAC,3:44100 采样率1:采样长度1:声道。按照位数表示数据就为:0xAF而 audio specific config 只须要在发起推流时,发送音频数据之条件议一次即可。其数据为两字节:
第一个数据:AAC-LC 值为 2,占用 5 位,则数据为: 0001 0
第二个数据:采样率 44100 值为 4,占用 4 位,则数据为:0100
第三个数据:声道,双声道为 2,单声道为 1,则数据为:0010(双声道),0001(单声道) 末了三位为 0,这样组成的数据 5+4+4+3=16 位,两字节。
双声道:0x12 ,0x10
单声道:0x12 ,0x08
Nginx-RTMP 做事器搭建
Linux 操作:下载 nginx wget http://nginx.org/download/nginx-1.15.3.tar.gz解压tar xvf nginx-1.15.3.tar.gz 下载 nginx rtmp 模块 wget https://codeload.github.com/arut/nginx-rtmp-module/tar.gz/v1.2.1 解压tar xvf v1.2.1 进入 nginx 目录cd nginx-1.15.3 实行:
在这个过程中可能由于环境不同而涌现不同缺点,比如短缺 pcre、openssl 等,这时候就须要安装这些库。
https://blog.csdn.net/z920954494/article/details/52132125
编译完成后,安装在当前目录的 bin 目录下。
cd bin/conf
vim nginx.conf 修正为:
实在便是从 nginx-rtmp-module-1.2.1/test/nginx.conf 中拷贝
端口占用检讨: lsof -i:8080
须要把稳的是目录与端口是否被占用,比如 8080 端口被占用,可以改为了 8081,然后须要开放端口。
C++音视频开拓学习资料:点击领取→音视频开拓(资料文档+视频教程+口试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
如果利用的阿里云做事器可以进入阿里云掌握台开放
然后点击 配置规则 ,在新页面点击添加 安全组规则 ,开放 8081 端口,然后确定,就可以了。
配置完成后,就可以启动 nginx 了在 nginx-1.15.3 目录 实行 bin/sbin/nginx 即可启动bin/sbin/nginx -s stop 停滞 一定要在 nginx-1.15.3 目录启动,由于上面的配置 error_log logs/error.log debug; 会去实行命令的目录下查找 logs。如果 error_log 改成一个绝对路径 那就没紧要了。在浏览器输入 【IP】:8081/stat ,能访问就表示配置完成了。此时一旦有播放器或者推流器连接到搭建的做事器刷新 此界面就能够看到如下界面:(手机推流,ffplay、网页、potplayer 播放)