药导

药导

1个粉丝

23

问答

0

专栏

11

资料

药导  发布于  2016-08-15 14:12:16
采纳率 0%
23个问答
8153

由技入道:迅捷学习RTMP

 
本帖最后由 药导 于 2016-8-16 14:54 编辑

先把做好的思维导图发上来,具体的内容,晚上来完善(都是围绕思维导图来写的,有兴趣的可以先把思维导图下下来先看一下)。
思维导图是用mind manager做的,个人比较喜欢mind manager,有兴趣的也可以下下来用一下,我买的是mind manager 15,这里给大家提供一个破解版的。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
先来张整体思维导图,有说得不对的地方,还请大家多多指正。


在我学习 RTMP 开发时,有幸找到雷霄骅博士的 [url=http://blog.csdn.net/leixiaohua1020/article/details/15814587]RTMP流媒体技术零基础学习方法[/url],不得不说,雷博对 libRtmp的研究是非常深入的,吃得很透。但雷博的这些文章,从我现在来看,很多是做 RTMP Client 开发没必要一上来就看的,而且他对 RTMP 具体数据打包封装的部分没有讲到。我写这篇《由技入道:迅捷学习RTMP》的目的,是为了给想要做 RTMP 开发的朋友一个快速上手开发 RTMP 一站式的教程。争取所有人在看完之后,都可以马上进行 RTMP Client 的开发。
(本文引用了很多其他网友的图片及文章,在本文最后都附有引用文章的连接,如有侵权,请联系我。)

基础要求:稍微有点音视频技术基础即可。
亮点:从实际应用出发,深入剖析 RTMP Client 开发中的重点、难点,避开枯燥的协议概念,迅速上手;

以下正文
///////////////////////////////////////////////////////////////////////////////////////////////////////
一、RTMP 简介
       RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,可用于实现直播、点播应用,最初由 Macromedia 公司创建,后来归Adobe公司所有,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等。
       除 RTMP 外,httpflv 以及 HLS 等直播协议也被广泛使用,其中 httpflv 比较成熟,比较容易使用第三方的 CDN(Content Delivery Network :内容分发网络),而支持 RTMP 的 CDN 成本要比 http 高,因此现在很多的直播平台都是采用主线路cdn 提供的 httpflv + 次线路 RTMP 的模式(比如 Youtube);而 HLS 相对于 RTMP 及 httpflv 的优点是,它可以 html5 播放,适用于手机端看,所以目前大部分跨平台直播都选择 HLS 协议来做直播,但 HLS 延迟比较大,9秒以上(Twich在用)。
       RTMP 协议的优势在于,它本身就是为直播而开发的,延迟低(3秒左右),架构比较简单,使用 Flash Player 作为播放器客户端,而 Flash Player 现在已经安装在了全世界将近 99% 的 PC 上,因此一般情况下收看RTMP流媒体系统的视音频是不需要安装插件的,用户只需要打开网页,就可以直接收看流媒体,十分方便,据不完全统计,国内目前直播量最多的就是 RTMP。
       可以这样概括一下:凡是想实现“无插件直播”的流媒体系统,都会使用RTMP。

RTMP 采用典型的 C/S架构,服务器端软件有比较多的选择:
[table=50%]                               
[tr][td]名称[/td]                                [td]开发语言[/td][td]所属公司[/td][td]备注[/td][/tr]
[tr][td]FMS [/td]                                [td]              [/td][td]Adobe [/td][td] [/td][/tr]
[tr][td]Red5 [/td]                                [td]java       [/td][td]开源 [/td][td] [/td][/tr]
[tr][td]CRtmpServer [/td]                        [td]C++      [/td][td]开源 [/td][td]目前非常活跃 [/td][/tr]
[tr][td]Simple Rtmp Server[/td]        [td]             [/td][td]开源 [/td][td]国人开发的 [/td][/tr]
[tr][td]Wowza Media Server[/td]        [td]             [/td][td]Wowza [/td][td] [/td][/tr]
[/table]
       
客户端可以使用 FMLE(Flash Media Live Encoder )、OBS(Open Broadcaster Software)(内部还是使用的 libRtmp,编码使用的是 x264 和 faac)免费软件抓取 PC 是摄像头和麦克风的数据,不过毕竟它们应用范围有限,想要把它嵌入到自己的程序中,还是要自己来实现RTMP协议的推送,目前使用得最多的是一个开源项目 RtmpDump(libRtmp)。
注:RtmpDump 和 libRtmp 的关系,RtmpDump 只是 libRtmp 的一个使用 demo ,通过它可以抓取 rtmp 服务器的音视频流进行保存等,除此之外, libRtmp 还提供了 RtmpSrv (轻量级 Rtmp 服务器)等几个 demo。

二、FMS的安装及使用

因为我们的主要目标是学习 RTMP Client 的开发,所以在这里服务器端我们选择安装简单,可靠性比较高的 FMS(或者叫AMS,附件中提供了 64 位的 FMS 5 的安装包,你也可以去FMS官网下载其他版本的),下面是 FMS 的安装及使用:
1、在Windows上安装 FMS

首先,将下载下来的 FMS 5 安装包解压,得到 AdobeMediaServer_5_LS1_win64.exe,双击打开

点击 next

选择接受协议,然后 next

这里不需要输入注册码,安装后为开发版,有10个连接数限制。

继续 next

选择你想安装的位置(最好不要带中文)

这里可以选择安装 Apache,不装也没关系

next 就好了

这里设置你的管理账户的用户名和密码,设个自己喜欢的吧

这里设置 RTMP 的端口等,一般不改,如果你装了 Apache ,端口冲突的话,就把这里的 80 改为其他没用的吧

最后确认一下,OK的话就 Install 了,不出意外你会看到这个

点击 Finish 之后,会弹出一个页面

还是蛮酷的,这个页面可以在这里打开

第二个 Adobe Media Server Start Screen 打开刚才那个页面
第一个 Adobe Media Administrator Console 可以打开管理页面

输入你刚才设置的账号密码,就可以进行管理,不过一般也用不到

好了,到这里, RTMP 的服务器 FMS 就搭建好了,默认是直接打开了的,如果没打开,在开始->Adobe->Adobe Media Server 5 里面有相应的选项打开

附件:RTMP 迅捷开发.zip
附件:mind manger 15破解版下载地址.zip
附件:rtmp规范翻译1.0.pdf附件:ISO-14496-3(2009-09).pdf附件:ISO_IEC_14496-15_2010.pdf
易百纳技术社区文件: RTMP 迅捷开发.zip
下载
易百纳技术社区文件: mind manger 15破解版下载地址.zip
下载
易百纳技术社区文件: openssl-1.0.1t.tar.gz
下载
易百纳技术社区文件: rtmpdump.tar.gz
下载
易百纳技术社区文件: ISO_IEC_14496-15_2010.pdf
下载
易百纳技术社区文件: ISO-14496-3(2009-09).pdf
下载
易百纳技术社区文件: rtmp规范翻译1.0.pdf
下载
我来回答
回答30个
时间排序
认可量排序

kg123456

0个粉丝

14

问答

0

专栏

3

资料

kg123456 2016-08-15 14:14:04
认可0
看看先   话说破解版的mind manager 15还要钱呐:L

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-08-15 14:35:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36091&ptid=12294]kg123456 发表于 2016-8-15 14:14[/url]
看看先   话说破解版的mind manager 15还要钱呐[/quote]

=.=!这是我花了几十大洋在某宝买的,貌似外面找不到。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-08-15 15:50:33
认可0
2、在 linux 上搭建 FMS 服务器
因为我是在自己的 阿里云 服务器上搭建的 FMS 服务器,我的阿里云服务器上很多 FMS 依赖的环境都配好了,所以这里暂时不出 linux 上搭建 FMS 的过程了。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-08-15 15:53:32
认可0
本帖最后由 药导 于 2016-8-15 16:33 编辑

三、libRtmp

前面我们已经把 RTMP 服务器搭建好了,现在我们来准备一下 RTMP 客户端的编写,目前 RTMP 客户端比较好的一个选择是使用 libRtmp 来写,在这里,我们也是如此。

首先,我们先下载 RtmpDump 的源码
[code]git clone git://git.ffmpeg.org/rtmpdump[/code]
(没有装git的,我附件里面也提供 RtmpDump 源码包)

好了,libRtmp 源码下下来了,但是我们不能马上编译,因为它还依赖于 openssl ,如果你还没有交叉编译过 openssl 库的话,就像我这样,来编译,安装一下吧

先去把 openssl 源码下下来(可以进下面链接)
[url]https://www.openssl.org/source/[/url]

我下载的是openssl-1.0.1t

下好之后,解压
[code]tar -xzvf openssl-1.0.1t.tar.gz[/code]

进入解压后的源码目录,输入类似如下的配置命令

[code]./config no-asm shared --prefix=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/usr --cross-compile-prefix=/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-[/code]

no-asm : Do not use assembler code.

shared : (编译连接成动态库)

--prefix : 指定之后make install后生成的执行文件跟库的存放位置,后面部分是我个人的位置,建议直接安装在海思工具链的库目录下(就像我这样)。

--cross-compile-prefix :指定交叉编译工具位置及其前缀。

然后 make depend
会报错:
making depend in crypto...
make[1]: 正在进入目录 `/home/kason/share/temp/openssl-1.0.1t/crypto'
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
cc1: error: unrecognized command line option "-m64"
make[1]: *** [local_depend] 错误 1
make[1]:正在离开目录 `/home/kason/share/temp/openssl-1.0.1t/crypto'
make: *** [depend] 错误 1

这是因为Makefile里的一个在64位机器上才使用的参数 -m64 ,打开 Makefile 修改两个地方
1:大概 64 行(如果你也是openssl-1.0.1t的话)

CFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wall  
可能具体内容不一样,不过没关系,将其中的-m64删除即可

2:大概180行

SHARED_LDFLAGS=-m64  将-m64删除

之后再编译就没问题了

[code]make depend
make
make install[/code]

编译好 openssl 之后,就可以来交叉编译 libRtmp 了,进入 RtmpDump 目录,使用以下命令:
[code]make SYS=posix CROSS_COMPILE=arm-hisiv100nptl-linux- INC=-I/opt/hisi-linux-nptl/arm-hisiv100-linux/target/usr/include[/code]
这里的INC=-I/opt/hisi-linux-nptl/arm-hisiv100-linux/target/usr/include 中必要还含有 openssl 的头文件,这也是我之前为什么建议把 openssl 安装在海思的工具链目录下的原因,

不出意外的话,是直接可以编译通过的。
编译完成后,会出现rtmpdump、rtmpgw、rtmpsrv、rtmpsuck几个可执行文件,我们选择 rtmpdump 来测试一下
将 rtmpdump 以及 librtmp的库(库要记得放到板子上的/lib 或者 /usr/lib下)拷到板子上

使用以下命令,将之前安装好的 FMS 服务器上的一段视频下下来
[code]./rtmpdump -o savename.flv -r rtmp://你服务器IP/vod/mp4:sample1_500kbps.f4v[/code]

注:
-o 是输出文件
-r 是输入url的地址
/vod/mp4:sample1_500kbps.f4v 这个是 FMS 自带就有的视频源,可以在 你的 FMS 安装目录 “\Adobe\Adobe Media Server 5\webroot\vod” 中找到





具体rtmpdump使用命令可以看[url=http://blog.csdn.net/leixiaohua1020/article/details/14229047]RTMPdump 使用说明[/url]

chuxian

0个粉丝

7

问答

0

专栏

0

资料

chuxian 2016-08-15 16:20:53
认可0
赞一个,写的好详细,慢慢看:lol

dinclude

0个粉丝

2

问答

0

专栏

0

资料

dinclude 2016-08-15 16:23:07
认可0
写的真好  很有学问

9crk

1个粉丝

34

问答

0

专栏

6

资料

9crk 2016-08-15 16:23:19
认可0
本帖最后由 9crk 于 2016-8-15 16:38 编辑

前排~顶一个。 坐等推流代码。。

药导

1个粉丝

23

问答

0

专栏

11

资料

药导 2016-08-15 16:41:05
认可0
本帖最后由 药导 于 2016-8-15 16:57 编辑

好了,如果一路顺利的话,现在我们可以自己来写 RTMP Client 推流给 RTMP 服务器了,在这之前,我们需要学习一下 libRtmp 库的使用,雷博士有几篇专门讲这个库使用的博文([url=http://blog.csdn.net/leixiaohua1020/article/details/12952977]RTMPdump 源代码分析 1: main()函数[/url]),不过现在我们是进行迅捷开发,暂时不去看 rtmpdump 的源码了。直接看它的几个关键函数:

[code]RTMP_Init();             //初始化结构体
RTMP_ParseURL();         //解析输入URL
RTMP_SetupStream();      //一些设置
fopen();                 //打开文件,准备写入
RTMP_Connect();          //建立NetConnection
RTMP_ConnectStream();   //建立NetStream
Download();              //下载函数
RTMP_Close();            //关闭连接
fclose();                //关闭文件[/code]

RTMP_Init()  函数负责初始化 RTMP 结构体,这个结构体贯穿了我们 RTMP 库使用的始终,
RTMP_ParseURL()  函数其实就是一个字符串解析函数,用来解析输入的URL,判断是否为符合 RTMP 规范的 URL
RTMP_SetupStream()  设置一些参数,基本都是一样的
RTMP_Connect()
RTMP_ConnectStream()  这两个函数建立了客户端和服务器之间的连接和流连接,没什么好说的

完了使用RTMP_Close()  关闭 RTMP 结构体,结束。
当然,这只是在下载的时候使用的函数,在发送时,我们还需要SendPacket()来发送数据包。
libRtmp常用的就是这么几个接口了,是不是很简单?别急,待会直接有注释得满满的代码给你们,到时候依葫芦画瓢就好了,现在不用把时间去花在看源码上,我们先来看看 RTMP 协议

四、RTMP协议浅析
RTMP 协议是一个互联网TCP/IP五层体系结构中应用层的协议。RTMP协议中基本的数据单元称为消息(Message)。当 RTMP 协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。
消息
是 RTMP 协议中基本的数据单元,不同种类的消息包含不同的 Message Type ID,代表不同的功能(例如,Message Type ID为8,9的消息分别用于传输音频和视频数据)。消息又由消息首部(Message Header)和 消息体(Message Body)组成,如下图。

消息首部由四部分组成:
Message Type ID: 1Byte,标志消息类型;
Payload Length:  3Byte,标志消息长度;
TimeStamp:       4Byte,标志消息时间戳,
Stream ID:       3Byte,标志消息所属媒体流的 ID

消息体内则是该消息的净荷数据。

消息块
在网络上传输数据时,消息需要被拆分成较小的数据块,才适应在相应的网络环境上传输,RTMP 协议规定,消息在网络上传输时被拆分成消息块(Chunk)。消息块的报文结构如图所示:


消息块具体如何,我们暂时可以不去追究,这些是在 libRtmp 库里面做的事情,只有在需要抓包分析时候,才会用到的知识,这里我们先大致了解一下就好,具体可以看我上传的附件“rtmp规范翻译”。

然后我们来看一张 RTMP 流媒体播放过程的图,这张图我们也只快速过一遍就好,不用太过纠结,因为这个和上面的消息块一样,都是在库里面完成了的,在这里介绍,只是为了大家有个概念

Singcol

0个粉丝

4

问答

0

专栏

1

资料

Singcol 2016-08-16 08:24:44
认可0
好帖子!Mark一下

包龙兔

0个粉丝

14

问答

0

专栏

0

资料

包龙兔 2016-08-16 09:44:31
认可0
呱唧呱唧,鼓励鼓励!

_nucong

2个粉丝

24

问答

0

专栏

4

资料

_nucong 2016-08-16 11:31:50
认可0
好久没有上来了, 好帖就给你个赞!

ns001x

0个粉丝

28

问答

0

专栏

1

资料

ns001x 2016-08-16 11:50:27
认可0
本帖最后由 ns001x 于 2016-8-16 11:51 编辑

难得好帖,不过疑问是为啥推 FMS ,如待组织成 crtmpserver 或者 srs,那就更完美了:P  

huizikitty

0个粉丝

0

问答

0

专栏

0

资料

huizikitty 2016-08-20 14:48:32
认可0
好东西,很详细,按照楼主的方法,移植成功。。。

huang

0个粉丝

12

问答

0

专栏

0

资料

huang 2016-08-23 09:23:08
认可0
非常好!谢谢!!!!

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-13 18:44:22
认可0
分不够,还不能下载。:(

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-14 13:48:43
认可0
擦了,购买了后权限不够,:@

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-14 13:49:16
认可0
咋搞啊,多回复两次,看来

wisedo

0个粉丝

2

问答

0

专栏

0

资料

wisedo 2017-07-17 18:05:50
认可0
/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/../lib/gcc/arm-hisiv100-linux-uclibcgnueabi/4.4.1/../../../../arm-hisiv100-linux-uclibcgnueabi/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make[1]: *** [librtmp.so.1] 错误 1
make[1]:正在离开目录 `/root/hi3518/lib/rtmpdump/librtmp'
make: *** [librtmp/librtmp.a] 错误 2
这错误怎么解啊?各位大神。折磨死我了。

souleo

0个粉丝

0

问答

0

专栏

0

资料

souleo 2017-08-22 15:33:31
认可0
新人过来学习下

chuxian

0个粉丝

7

问答

0

专栏

0

资料

chuxian 2017-10-24 09:39:33
认可0
感觉还没有更完的节奏,是我看错了?:lol
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区