一个问题?
在上一节我们使用SRS搭建了RTMP环境,那么在企业开发中,是否使用第三方的RTMP服务器(例如上一节的SRS)就可以了呢?或者说:作为一个音视频开发人员,就会配置就OK了呢?实际上不是的,一些稍微大的企业都是会自己开发RTMP服务器的,那么这就要求我们对于RTMP协议有深刻的理解,然后基于这些协议的理解自己有一定的能力开发RTMP协议。
一 学习路线:
1.学习如何配置一个 RTMP的服务器(配置SRS中的RTMP,并启动srs)
流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器-CSDN博客
1.1 开启成熟的流服务器 SRS
1.1.1 开启SRS
当前我的 linux 的ip 为 192.168.31.251,这里记录一下,后面要用
1.1.2 测试 服务器是否开启成功
将一个影音文件发送到 流媒体服务器,然后,使用 拉流,拉这个地址看是否能播放成功.
如下的两个步骤都在windows上使用ffmpeg 命令完成
推流
ffmpeg -re -i D:/yinshipinres/source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.31.251/study/acha
这个意思是,将D:/yinshipinres/source.200kbps.768x320.flv 文件,推流给服务器,而服务器的地址是rtmp://192.168.31.251/study/acha
-re 参数 设置 以实时的速度 读取 输入文件 , 如 : 输入视频的长度是 3 分钟 , 那么 使用 3 分钟的时间来处理这个视频 , 不能用最快速度处理完 , 该设置确保了推流的速度与视频播放的速度相匹配 ;
-i input.mp4 参数 设置 输入文件名称是 input.mp4 , 此处也可以是 实时的录屏 ;
/study/acha 这个名字在这里是乱取的,但是这个应该就有规则,或者有一个默认的规则。实际上后面学习到的nginx什么的,确实是有一定的规则的。
后面再学习nginx上配置 rtmp的时候,如下的可以参考
rtmp://39.105.129.233/myapp/ 参数 , rtmp 是 流媒体协议 , 39.105.129.233 是流媒体服务器 , myapp 是在 流媒体服务器 的 nginx.conf 中配置的 rtmp / server / application 配置中配置的应用名称 ;
拉流
ffplay rtmp://192.168.31.251/study/acha
注: 上述命令中的flv完整路径,以及srs server ip,⼤家根据情况⾃⾏替换为实际值。 另外:默认情况下
srs的rtmp采⽤1935端⼝,如果该端⼝被占⽤或修改了srs.conf中的端⼝,注意根据情况调整;防⽕墙如 果开了,也要检测下1935是否允许访问。


2.学习 RTMP 协议,
学习完协议后,理论上就应该编程了,前辈们已经写好了专门的RTMP库的第三方库,我们要学习这个库的使用
3.学习 librtmp 库的配置使用。
流媒体服务器二 3学习 librtmp 库的配置使用-CSDN博客
4.学习如何通过摄像头和 麦克风将现场录制的数据 通过 RTMP 协议推送到服务器。并保存到本地。
5. 学习如何从 服务器 拉流到本地的代码实现
6.SRS 源码分析
7. 自己手写一个类似于 SRS的服务器
二 RTMP协议详解
1.RTMP 协议是个啥?我们要学哪些知识点?
RTMP 是 Real Time Messaging Protocol( 实时消息传输协议) 的首字母缩写。该协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。
RTMP 与 HTTP 一样, 都属于 TCP/IP 四层模型的应用层。
上述红色部分的含义如下图:

我们在开发android程序的时候,使用OKHTTP开源库,封装了socket完成http数据的开发。
librtmp 这个开源库,封装了socket建立TCP通讯,并实现了RTMP数据的收发。
因此这里我们要学习RTMP协议外,还需要学习一下librtmp这个开源库的很多具体的api,这样才能更好的理解和使用 RTMP

RTMP 协议传输时会对数据格式化,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把 Message 划分为带有 Message ID 的 Chunk,每个 Chunk 可能是一个单独的 Message,也可能是 Message 的一部分,在接收端会根据 Chunk 中包含的 data 的长度,message id 和 message 的长度把 chunk 还原成完整的 Message,从而实现信息的收发。 (Message, Chunk)
2. librtmp库--编写RTMP代码时要用到的库
librtmp是一个开源的基于C语言的库,提供了一个连接RTMP服务器,发送和接收RTMP流的API。
它可以用来开发流媒体播放器,网络直播等应用。它的主要特点是快速、稳定和低延迟。
librtmp支持RTMP,RTMPS,RTMPE和RTMPTE加密协议等多种协议。除此之外,它还支持
PProxy,PPlayer和appspot的代理服务器协议。在Linux下,使用librtmp开发的应用可以支持
Windows,Android等多种系统平台。
librtmp的核心代码是基于ffmpeg中的libavformat库实现的。它依赖于libz, libssl, libcrypto等第三方
库,需要自行编译安装。
三. 如何学习 RTMP
我们按照直播架构的三部分学习,顺序是1,2,3 ,为什么不是1,3,2呢?因为3最难。
1实际上就是 直播人员
2实际上就是 观看直播观众
3实际上就是 流媒体服务器
如何学习呢?
搭建一个1,2,然后使用成熟的流媒体服务器3(我们这里就使用SRS),
先将1推送到 流媒体服务器3, 把1 学明白了,然后再学2,
最后学习3

2. 手写代码完成给SRS 服务器发送数据,推流过程使用代码完成
我们当前在服务器开启后,是通过 ffmpeg命令给服务器中推送数据的,如下
ffmpeg -re -i D:/yinshipinres/source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.31.251/study/acha
这一节的任务就是要将这个命令 换成代码,这块的内容都是围绕这个重点开始的。
这一步,我们也要细分。
首先是 将一个mp4文件,或者wav文件,flv文件,通过RTMP协议推送到服务器。
那么如何推送数据到服务器呢?以及推送的格式是啥呢?这就要先要学习 RTMP的协议,然后学习RTMP librtmp 库是如何

414

被折叠的 条评论
为什么被折叠?



