[總結]RTMP流媒體技術零基礎學習方法

本文主要總結一些我在學習RTMP流媒體技術過程中積累的經驗。也爲後來學習RTMP流媒體技術的人們一個參考。本文力圖從簡到難,循序漸進的介紹RTMP流媒體技術的方方面面,先從應用說起,逐步深化剖析相關工程的源代碼。看完本文的話應該會對RTMP流媒體技術有比較完整的瞭解。


0.背景知識

本章主要介紹一下RTMP流媒體技術都用在了哪裏(在這裏僅列幾個我所知的,其實遠比這個多)。說白了就是爲了說明:RTMP是非常重要的。

使用RTMP技術的流媒體系統有一個非常明顯的特點:使用 Flash Player 作爲播放器客戶端,而Flash Player 現在已經安裝在了全世界將近99%的PC上,因此一般情況下收看RTMP流媒體系統的視音頻是不需要安裝插件的。用戶只需要打開網頁,就可以直接收看流媒體,十分方便。

目前使用RTMP技術的電視臺有如下幾個:

CNTV部分點播內容

中國教育電視臺1直播(rtmp://pub1.guoshi.com/live/newcetv1)[失效]

中國教育電視臺3直播(rtmp://pub1.guoshi.com/live/newcetv3)[失效]

香港電視臺直播(rtmp://live.hkstv.hk.lxdns.com/live/hks)

北廣傳媒移動電視直播(rtmp://www.bj-mobiletv.com:8000/live/live1)

中石化網絡電視臺直播(rtmp://wowza.sinopectv.cn:1935/live/sinopec)[暫時無法訪問]

東莞電視臺(rtmp://ftv.sun0769.com/dgrtv1/mp4:b1)

紹興新聞綜合(rtmp://www.scbtv.cn/live/new)

使用RTMP技術社交直播平臺:

六間房
9158
新浪秀場

可以這樣概括一下:凡是想實現“無插件直播”的流媒體系統,都會使用RTMP。


1.RTMP在Flash流媒體系統中的使用

RTMP被Adobe開發出來,就是用於在其Flash平臺的流媒體系統之間傳遞數據的。因此想要了解RTMP,需要首先了解Flash流媒體系統。

最簡單的Flash流媒體系統由兩部分組成:

客戶端:Flash Player(一般只有這一種)

注:支持RTMP的基於Flash的播放器除了可以自己開發之外,還有現成的,比如說jwplayerflowplayer等等。

服務器端:

1.Flash Media Server(FMS):Adobe官方的流媒體服務器。畢竟是商業服務器,其性能應該是最強的,配置是最簡單的,但是價格不菲,推薦作爲入門學習使用。個人下載使用是不用花錢的。服務器端編程使用ActionScript語言。

官網:http://www.adobe.com/cn/products/adobe-media-server-family.html

可參考教程:

1.FMS開發者嚮導。這個教程講的是FMS開發技術,是網友翻譯的中文版,學習起來比較方便。這裏有英文原版,內容更全:Flash Media Server Delevoper's Guide

注:FMS開發技術方面使用到了ActionScript,可以先找相關教程做一個初步的瞭解。主要使用Flash CSx進行開發。

2.FMS技術指南。這個教程主要是講述FMS配置的,第2部分涉及到集羣,負載均衡等內容,挺高端的。

2.Red5:開源流媒體服務器,基於Java的。曾經使用過,感覺也還算比較方便,如果商業應用,又買不起昂貴的FMS的話,使用也不錯。服務器端編程使用Java語言。

官網:http://www.red5.org/

3.還有其他服務器,但目前我還沒接觸過


2.RTMPdump(libRTMP)的使用

這一章就要開始學習RTMP協議的處理了。

可以使用RTMPdump(libRTMP)進行學習。這是一個C++的開源工程。主要作用是下載RTMP流媒體。首先可以瞭解一下其使用方法:RTMPdump 使用說明

官網:http://rtmpdump.mplayerhq.hu/


3.RTMPdump(libRTMP)源代碼分析

這一章開始學習RTMPdump(libRTMP)的源代碼。學習它之前需要有Socket編程的基礎。

首先學習《RTMP協議規範

中文翻譯版:http://download.csdn.net/detail/leixiaohua1020/6563059

英文原版:http://www.adobe.com/cn/devnet/rtmp.html

我對其部分內容做的簡單分析:RTMP規範簡單分析

其次從協議規範中,總結出RTMP協議建立連接的流程:RTMP流媒體播放過程

然後,下載一個windows下可以編譯通過的RTMPdump工程(這個工程是很難得!):rtmpdump vs2005版本

(當然,linux下會方便很多,因爲RTMPdump就是在linux下開發完成的)

最後,通過調試工程,就可以基本掌握RTMP協議了,我寫了一些分析RTMPdump(libRTMP)源代碼的文章:

RTMPdump 源代碼分析 1: main()函數
RTMPDump(libRTMP)源代碼分析 2:解析RTMP地址——RTMP_ParseURL()
RTMPdump(libRTMP) 源代碼分析 3: AMF編碼
RTMPdump(libRTMP)源代碼分析 4: 連接第一步——握手(Hand Shake)
RTMPdump(libRTMP) 源代碼分析 5: 建立一個流媒體連接 (NetConnection部分)
RTMPdump(libRTMP) 源代碼分析 6: 建立一個流媒體連接 (NetStream部分 1)
RTMPdump(libRTMP) 源代碼分析 7: 建立一個流媒體連接 (NetStream部分 2)
RTMPdump(libRTMP) 源代碼分析 8: 發送消息(Message)
RTMPdump(libRTMP) 源代碼分析 9: 接收消息(Message)(接收視音頻數據)
RTMPdump(libRTMP) 源代碼分析 10: 處理各種消息(Message)


4.相關示例代碼

下面的工程包含了和RTMP相關的示例代碼。


(1)libRTMP單獨進行流媒體處理的例子

simplest libRTMP example
最簡單的基於librtmp的示例
簡介
本工程包含了LibRTMP的使用示例,包含如下子工程:

simplest_librtmp_receive: 接收RTMP流媒體並在本地保存成FLV格式的文件。

simplest_librtmp_send_flv: 將FLV格式的視音頻文件使用RTMP推送至RTMP流媒體服務器。

simplest_librtmp_send264: 將內存中的H.264數據推送至RTMP流媒體服務器。

 
文章
《最簡單的基於librtmp的示例:接收(RTMP保存爲FLV)》
《最簡單的基於librtmp的示例:發佈(FLV通過RTMP發佈)》
《最簡單的基於librtmp的示例:發佈H.264(H.264通過RTMP發佈)》
項目主頁
SourceForge:https://sourceforge.net/projects/simplestlibrtmpexample/
Github:https://github.com/leixiaohua1020/simplest_librtmp_example

開源中國:http://git.oschina.net/leixiaohua1020/simplest_librtmp_example


(2)FFmpeg和libRTMP結合進行流媒體處理的例子

simplest ffmpeg streamer
最簡單的基於FFmpeg的推流器(推送RTMP)
簡介
本例子實現了推送本地視頻至流媒體服務器(以RTMP爲例)。是使用FFmpeg進行流媒體推送最簡單的教程。
文章
《最簡單的基於FFmpeg的推流器(以推送RTMP爲例)》
《最簡單的基於FFMPEG的推流器附件:收流器》
項目主頁
SourceForge:https://sourceforge.net/projects/simplestffmpegstreamer/
Github:https://github.com/leixiaohua1020/simplest_ffmpeg_streamer

開源中國:http://git.oschina.net/leixiaohua1020/simplest_ffmpeg_streamer


(3)使用Adobe Flash中的ActionScript(而非C/C++)處理的例子

Simplest flashmedia example
 最簡單的基於Flash的流媒體示例
簡介
本程序是一個Flash流媒體示例的合集。其中包含了使用Actionscript編寫的推流器和播放器,以及網頁播放器。本工程包含如下基於Flash技術的流媒體的例子:

simplest_as3_rtmp_player:  最簡單的RTMP播放器(基於ActionScript)

simplest_as3_rtmp_streamer:最簡單的RTMP推流器(基於ActionScript)

rtmp_sample_player_adobe: 從Adobe Flash Media Sever提取出來的測試播放器

rtmp_sample_player_wowza: 從Wowza服務器中提取出來的測試播放器

rtmp_sample_player_flowplayer: 基於FlowPlayer的RTMP/HTTP播放器(添加RTMP plugin)

rtmp_sample_player_videojs: 基於VideoJS的RTMP/HTTP播放器

rtmp_sample_player_jwplayer: 基於JWplayer的RTMP/HTTP播放器

hls_sample_player_flowplayer: 基於FlowPlayer的HLS播放器(添加HLS plugin)

hls_video_player_html5: 基於HTML5的HLS/HTTP播放器

activex_vlc_player:  基於VLC的ActiveX控件的播放器


文章
《最簡單的基於Flash的流媒體示例:RTMP推送和接收(ActionScript)》
《最簡單的基於Flash的流媒體示例:網頁播放器(HTTP,RTMP,HLS)》
項目主頁
SourceForge:https://sourceforge.net/projects/simplestflashmediaexample/
Github:https://github.com/leixiaohua1020/simplest_flashmedia_example

開源中國:http://git.oschina.net/leixiaohua1020/simplest_flashmedia_example


5.相關應用

libRTMP作用還是很大的,除了可以保存RTMP流媒體之外,還可以發送RTMP流媒體等等。它可以整合到FFMPEG中,下面幾篇文章簡述了它的應用:

libRTMP使用說明
在FFMPEG中使用libRTMP的經驗

(以後更新其他方面......)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章