通过例子学习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 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rtmpdump是一个开源的命令行工具,用于从流媒体服务器上下载或录制RTMP流(Real-Time Messaging Protocol)。vc工程是指使用VC++编写的工程项目。将两者结合起来,意味着在VC++环境下使用rtmpdump工具进行流媒体下载或录制。 要在VC++中使用rtmpdump工具,首先需要下载并安装rtmpdump源代码。然后在VC++项目中添加rtmpdump的相关文件,并在代码中引用相关的头文件。接下来,就可以使用rtmpdump提供的函数来实现对RTMP流的下载或录制。 具体而言,可以使用rtmpdumprtmpdump()函数指定要下载或录制的RTMP流的URL,并设置保存的文件路径。通过调用该函数,rtmpdump将连接到流媒体服务器并获取流媒体数据,并将其写入指定的文件中。在下载或录制过程中,还可以使用rtmpdump的其他函数来处理数据流,例如解密、分段等操作。 在VC++中使用rtmpdump工程可以为流媒体下载或录制提供更灵活和定制化的功能。通过使用VC++的编程特性,可以进行更高级的数据处理和界面设计,实现更复杂的功能需求。同时,rtmpdump的开源性质也使得用户能够根据自己的需求对其进行修改和扩展。 总之,通过在VC++中使用rtmpdump工程,可以方便地实现对RTMP流的下载或录制,并根据需要进行定制化的功能扩展。这为开发者提供了更大的灵活性和自由度,以满足不同的流媒体处理需求。 ### 回答2: rtmpdump是一款用于从RTMP流媒体服务器下载或录制音频/视频内容的开源工具。vc工程是指使用Visual C++编程语言和开发环境创建的软件项目。 要创建一个rtmpdump的vc工程,首先需要下载rtmpdump的源代码,然后使用Visual C++打开相应的工程文件。接下来需要配置工程的编译环境,确保所需的头文件和库文件路径正确。 在工程中,会有一些源代码文件,这些文件负责实现rtmpdump的各种功能,例如建立与RTMP服务器的连接、发送请求、接收数据、数据解析等等。这些文件会被编译成可执行的二进制文件。 在编译期间可能会遇到一些依赖项问题,例如需要额外链接一些库文件以支持某些功能。开发人员需要根据编译过程中的错误信息,对工程进行适当的配置和调整,以确保成功编译。 一旦vc工程成功编译完成,就可以生成一个可执行文件,该文件可以在命令行中运行。通过指定RTMP服务器的URL和相关参数,可以让rtmpdump工具连接到服务器并下载或录制所需的音频/视频内容。 总的来说,创建一个rtmpdump的vc工程需要下载源代码、配置编译环境、解决依赖项问题,并根据需要添加自定义功能。通过编译和运行工程生成的可执行文件,就能实现从RTMP流媒体服务器下载或录制音频/视频内容的操作。 ### 回答3: rtmpdump是一个用于下载和保存RTMP流的工具。它提供了用于处理RTMP协议的源代码,可以自定义编译和构建,获得一个可以在不同平台上运行的RTMP下载工具。 RTMP是一种用于流媒体传输的协议,它是Adobe公司开发的一种实时通信协议,常用于视频直播、在线游戏和音频通信等领域。rtmpdump工具可以连接到RTMP服务器,读取和接收RTMP流,并将其保存为本地文件。 vc工程是指使用Visual C++编译器创建的工程。通过将rtmpdump的源代码加入到Visual C++工程中,我们可以使用VC++的功能和特性来构建和调试rtmpdump工具。这样,我们就可以根据自己的需求进行修改和定制,使其能够更好地满足我们的需求。 在vc工程中,我们可以使用rtmpdump的源代码来构建一个命令行界面的工具,以便用户可以通过命令行输入相关参数来下载RTMP流。我们可以利用Visual C++的调试功能来排查和修复可能存在的问题,提高工具的稳定性和性能。 除了在vc工程中进行开发和调试,rtmpdump还可以在不同的平台上进行编译和构建,如Linux、Mac和Android等。这使得rtmpdump工具具有更广泛的适用性和可移植性。 总结来说,rtmpdump vc工程是指使用Visual C++编译器创建的工程,并集成了rtmpdump的源代码,使其能够在Windows平台上运行和定制化,从而实现对RTMP流进行下载和保存的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值