本文主要總結一些我在學習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的播放器除了可以自己開發之外,還有現成的,比如說jwplayer,flowplayer等等。
服務器端:
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語言。
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的經驗
(以後更新其他方面......)