1. 程式人生 > >通過例子學習rtmpdump

通過例子學習rtmpdump

原文地址:http://pclosmag.com/html/Issues/201104/page19.html

強烈建議習慣英文者,ctrl+按住上面連結,跳轉。

RTMP Specification: http://www.adobe.com/devnet/rtmp.html

RTMPDUMP: http://rtmpdump.mplayerhq.hu/

引言

        今天,技術在革新,我們獲得了新的可能。電視廣播節目沒有過時,也在進步。今天,你可以觀看線上電視,點播的方式看電視節目。但如果你能錄製他們將會如何?莫擔心,一些節目和現場直播(還不是所有)可以被記錄。

如果你年已邁老,那麼你會記得(VCR)磁帶錄影機年代。你可以按“BUTTON”鍵,開啟視訊錄影機在不久之後關閉,接著倒帶後你就可以在電視上播放剛錄製的節目。那電腦時代又帶來了什麼呢?

一些理論

今天,電視被放入許多流行的流格式和協議,通過因特網廣播。

*你當然聽過這些流格式:FLV,MP4,F4V

*windows媒體流:WMV,ASF,ASX,及其他

也有很多不同的流格式,舉例來說:

*flash視訊:HTTP,RMTP,RTMPE

*windows媒體視訊:HTTP,RTSP,MMS,及其他

讓我們看看用RMTP協議廣播的服務。是什麼呢?維基百科說:“Real Time Messaging Protocol (RTMP:實時訊息協議)最初是由Macromedia公司(05年被adobe公司收購)為了,在flash播放器和伺服器之間,通過因特網傳輸音視訊及資料而開發的私有協議。現在該公司為adobe所有,它開放了這套協議的規範。”

所以如果你喜愛的線上服務(電視或視訊資料庫)依賴RTMP協議,那你有了好的機會能夠將其視訊流,存為本地檔案。有個極好的工具可以用來記錄電視廣播流和視訊點播,它就是“rtmpdump”。是啥?它是個控制檯工具包,針對RTMP流,基於此單詞(console)控制檯是否意味著優勢或劣勢?我覺得這是該工具一個很大的優勢,它的使用規則很簡單,你輸入命令及引數,它包括視訊伺服器的地址,然後得到一個滿足需要的檔案,包含了記錄的電視節目。你在螢幕上看不到任何圖形化的輸入,也沒有其他任何無用資訊。它只是連線伺服器,只消耗了網路流量,將視訊記錄到你的硬盤裡。如果你熟悉“wget”工具,那你可以想象到它的強大。

準備

是時候開始了。為讓你的作業系統可用“rtmpdump”,應該從對應的倉庫獲取同樣名字的安裝包,並安裝。這個包有其他用途,叫做“rtmpsuck”。這個工具可以記錄視訊流,但我們只將其用作一個輔助工具,為“rtmpdump”查詢選項。

為了使用“rtmpsuck”,我們需要準備一下。“rmtpsuck”是一個RTMP的本地代理伺服器,它自身傳輸網路流到因特網,探測流動的RTMP協議,同時它是引數。“rtmpsuck”沒有引數,所以如果你執行“rtmpsuck”會得到:

RTMP proxy server ... ... Streaming on rtmp://0.0.0.0:1935

那就是說該伺服器正在執行並檢測1935埠,有必要意識到這是rtmp伺服器的預設埠。但在這樣的情況下,“rtmpsuck”是毫無用處的,為何?因為要使它工作,你需要將RTMP流重定位到一個代理伺服器,這代理幫我們依次得知與媒體伺服器的連線引數。為此,作為“root”,執行如下指令:

iptables -t nat -A OUTPUT -p tcp --dport 1935 -m owner \! --uid-owner root  -j REDIRECT

該命令的意思是,在表中ip表中新增一個新的規則來控制你的網路流,將外傳到一個預設RTMP的外部伺服器埠(1935)的TCP流,重定位到一個本地的RTMP代理服務端,除了屬於“root”的的流。所以,如果你在瀏覽器開啟一個網頁播放媒體流,你的通訊量將流經那個代理伺服器,同時“rtmpsuck”會為你提供一些在“rtmpdump"能使用到的資訊。在獲取到所有資訊後,可以直接”CTRL+C“關閉”rtmpsuck“,並移除之前新增的“iptables”規則:

iptables -t nat -D OUTPUT -p tcp --dport 1935 -m owner \! --uid-owner root -j REDIRECT

例子1:線上IP電視廣播“Russia Today”(俄羅斯對外播出的24小時國際新聞頻道)

步驟1:根許可權執行一個終端:

iptables -t nat -A OUTPUT -p tcp --dport 1935 -m owner \! --uid-owner root -j REDIRECT

步驟2:……:

rtmpsuck

步驟3:普通使用者下,開啟火狐鍵入地址:http://rt.com/on-air/rt-america-air/

步驟4:切換到根使用者,你將看到如下:

app: live flashVer: LNX 10,1,82,76
swfUrl: http://rt.com/s/swf/player5.4.viral.swf
tcUrl: rtmp://rt.fms.visionip.tv/live
pageUrl: http://rt.com/on-air/rt-america-air/
Playpath: RT_US_3

過一段時間,用“CTRL+C”關閉。

依賴你的連線質量,你還會得到不同示意的“Playpath”選項。

通過在Playpath命令接續如下入口,你可以改變視訊質量的選項:

RT_US_3 – high
RT_US_2 – medium
RT_US_1 – low

步驟5:根許可權執行命令:

iptables -t nat -D OUTPUT -p tcp --dport 1935 -m owner \! --uid-owner root -j REDIRECT

步驟6:普通使用者:

rtmpdump -r rtmp://rt.fms.visionip.tv/live \
-a live \
-y RT_US_3 \ -W http://rt.com/s/swf/player5.4.viral.swf \
-p http://rt.com/on-air/rt-america-air/ \
-f "LNX 10,1,82,76" \
-o ~/rt.flv \
-V \
-B 600

十分鐘(600 秒)後在home目錄,你將得到一個視訊檔案,“rt.flv”。

執行“rtmpdump”的手冊命令,你將檢視到上述命令中引數的意思:

man rtmpdump

選項“-V”多餘的,如果你的錄製成功了可將其去除。

練習1:若你住在歐亞(或者這兩處對你來說,都不方便),你同樣可以過去到主要廣播節目的引數,可用該連結:http://rt.com/on-air/

rtmpdump -r rtmp://fms5.visionip.tv/live \
-y RT_3 \
-o ~/$FILENAME \
-B 1200

例子2:線上IP電視廣播“bloomberg”

重複1~5步驟,地址為:http://www.bloomberg.com/tv/

步驟6:普通使用者:(\  為行接續,別糊塗了喲)

rtmpdump -r rtmpt://cp87869.live.edgefcs.net/live \
-a live \
-y [email protected] \
-W http://player.ooyala.com/static/cacheable/29d28e187072cf05af879e362d57b42d/player_v2.swf \
-p http://www.bloomberg.com/tv/ \
-f "LNX 10,1,82,76" \
-o ~/bloomberg.flv \
-V \
-B 600 \
--live

這裡我們加上“--live”是為了使功能工作正常。

例子3:電視直播“euronews”

這次直播流的地址為:http://www.euronews.net/news/streaming-live/

“rtmpdump”給了我們以下:

app: rtpeuronewslive
flashVer: LNX 10,1,82,76
swfUrl: http://www.euronews.net/media/player_live_1_7.swf
tcUrl: rtmp://178.32.100.43:1935/rtpeuronewslive
pageUrl: http://www.euronews.net/news/streaming-live/
Playpath: eng_euronews-flash-750.sdp

那我們的命令就是:

rtmpdump -r rtmp://178.32.100.43:1935/rtpeuronewslive \
-a rtpeuronewslive \
-y eng_euronews-flash-750.sdp \
-W http://www.euronews.net/media/player_live_1_7.swf \
-p http://www.euronews.net/news/streaming-live \
-f "LNX 10,1,82,76" \
-o ~/euronews.flv \
-B 600

例子4:視訊點播“Deutsche Welle”

在這個網頁上能找到很多好的節目:http://www.dw-world.de/dw/0,,4756,00.html

如果你嘗試以上的技術,等著你的將是失望,當你失望的時候,可能你會吃不下飯。原因是此時的伺服器廣播時用了不同的埠。如果你review下“rtmpsuck”的原始碼,將會看到“1935”作為RTMP伺服器的預設埠寫死的,這就是為何“rtmpsuck"將在這個情況下對我們毫無幫助。

而能給我帶來新的工具是”tcpdump“,它是個控制檯的網路嗅探器。該工具的一個妙招是能顯示出網路報中可列印的符號,這就易於抓取網頁和這型別的東西。如果這個工具在系統中沒有安裝,你應該立即動手。下一個實用工具是”grep“,它有助於打印出模式匹配的行,匹配規則可以設定。

讓我們獲取到一個歐洲生活方式的好節目,叫做”Euromaxx“。我們假設RTMP代理伺服器處於關閉狀態,重定位流也沒工作。

步驟1:根許可權:

tcpdump -ieth0 -nn -A |grep -e"rtmp" -e"connect" -e"play">/euromaxx.txt

這個字串,包括了含在網路流和流經的網路介面(eth0 在我這裡是)模式(rtm,連線或播放),資訊會記錄在”Euromaxx.txt“檔案中,位置在根目錄”/“。

步驟2:普通使用者,開啟火狐網頁:http://mediacenter.dw-world.de/english/video/#!/93184/euromaxx/Program=7555

並且開始播放視訊。等視訊播放了一會兒後,在內嵌的播放器按下”pause“按鈕,並點選火狐的重新整理鍵。可重複4次。

步驟3:根許可權,將終端執行的例程打斷(CTRL+C)。

步驟4:開啟檔案”Euromaxx.txt“找到這樣一塊文字:

connect.?..........app..
a4337/dwwod1/..flashVer...LNX 10,1,82,76..swfUrl..;http://mediacenter.dw-world.de/player/flash/media.player.swf..tcUrl..*rtmpt://tvone.fcod.llnwd.net/a4337/dwwod1/[email protected]@[email protected] videoFunction.?.........pageUrl..Khttp://mediacenter.dw-world.de/english/video/#!/93184/euromaxx/[email protected] ................closeStream.....................H.....P.....play............;mp4:dwtv_video/flv/eme/emagen100311-eu romaxx01ep_sd_avc.mp4

現在你可以輕鬆判斷出”rtmpdump“選項了。

步驟5:普通使用者執行:

rtmpdump -r rtmpt://tvone.fcod.llnwd.net/a4337/dwwod1/ \
-a a4337/dwwod1/ \
-y mp4:dwtv_video/flv/eme/emagen100311-euromaxx01ep_sd_avc.mp4 \
-f "LNX 10,1,82,76" \
-W http://mediacenter.dw-world.de/player/flash/media.player.swf \
-p http://mediacenter.dw-world.de/english/video/#!/93184/euromaxx/Program=7555 \
-o ~/euromaxx.flv

過會兒你會發現記錄的檔案在home目錄下已經存在。

這套技術的缺陷在於,你在字串不恰當的地方碰到dots "."。原因是事實上它是文字格式的串被放置在兩個網路報裡,它本應該是連續的,然後”tcpdump“將不可列印的符號變成了點”.“。那麼,如果出錯,就在”rmtpdump“命令中鍵入”-V“,檢視除錯資訊。如果”rtmpdump“根本不能連線到伺服器,那出現這種情況很可能是個錯誤的URL。

結束語(原文:finish stroke)

在一個節目列表中錄下一些是很自然的希望。但如果你同樣的名字記錄檔案,則會被後來的檔案覆蓋。為避免這種情況,可以很方便的將直播伺服器的名字包含到檔名中,並加以記錄時間資訊,這樣就不會重複了。下面這個指令碼就顯示了這個技巧,可用於我們記錄的第一個電視直播例子:

#!/bin/bash
BASENAME="rt"
FILENAME="$BASENAME"_`date +%Y-%m-%d_%H%M%S`.flv
rtmpdump -r rtmp://rt.fms.visionip.tv/live \
-y RT_US_3 \
-o ~/$FILENAME \
-B 1200

練習2:給排程表寫一個指令碼,用於記錄昨天的節目,在點播視訊例子,用這個提示:

YESTERDAY=$(date -d yesterday +"%d%m%y")

#!/bin/bash
YESTERDAY=$(date -d yesterday +"%d%m%y")
rtmpdump -r rtmpt://tvone.fcod.llnwd.net/a4337/dwwod1/ \
-a a4337/dwwod1/ \
-y mp4:dwtv_video/flv/eme/emagen"$YESTERDAY"-euromaxx01ep_sd_avc.mp4 \
-W http://mediacenter.dw-world.de/player/flash/media.player.swf \
-p "http://mediacenter.dw-world.de/english/video/#!/75622/euromaxx/Program=7555" \
-f "LNX 10,1,82,76" \
-o ~/euromaxx_"$YESTERDAY".flv