首页 > 代码库 > 转 实例讲解RTMPDUMP的使用

转 实例讲解RTMPDUMP的使用

译文地址:http://blog.csdn.net/fallenink/article/details/8128095

 

强烈建议习惯英文者,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 us_300@21006 \
-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/..fpad....capabilities.@m........audioCodecs.@.........videoCodecs..@o....... videoFunction.?.........pageUrl..Khttp://mediacenter.dw-world.de/english/video/#!/93184/euromaxx/Program=7555..object.Encoding.@......... ................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


 

转 实例讲解RTMPDUMP的使用