转 实例讲解RTMPDUMP的使用

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

原文地址: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

时间: 2024-10-25 07:40:40

转 实例讲解RTMPDUMP的使用的相关文章

Android 实例讲解HorizontalScrollView实现左右滑动

本博文主要讲解怎么使用HorizontalScrollView实现左右滑动的效果. HorizontalScrollView实际上是一个FrameLayout ,一般通过只放置一个LinearLayout子控件.如果要使其添加其他的控件,就使用LinearLayout子控件来添加其他的控件,最后达到丰富其内容的效果.其中,LinearLayout设置的orientation布局为Horizontal.HorizontalScrollView不可以和ListView同时用,因为ListView有自

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

Java JUC之Atomic系列12大类实例讲解和原理分解

Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含: 基本类:AtomicInteger.AtomicLong.Atomic

Android 依赖注入: Dagger 2 实例讲解(一)

本文原创,转载请注明出处:http://blog.csdn.net/zjbpku 关于Dagger,在之前的博文(Android 依赖注入:Dagger 实例讲解(Demo下载))中已有介绍, 本文说的Dagger 2主要是由Google技术 人员参与开发的,当然包括Square的各位及其他一些Contributors在内的大牛也贡献了不少.该项目大概是从去年11月份开始启动的,到目前该项 目还在继续进行,Snapshot version也是刚刚发布不久,从Github提供的内容看,不久会是Pr

Oracle之索引(Index)实例讲解 - 基础

Oracle之索引(Index)实例讲解 - 基础 索引(Index)是关系数据库中用于存放表中每一条记录位置的一种对象,主要目的是加快数据的读取速度和数据的完整性检查.索引的建立是一项技术性要求非常高的工作. 一般在数据库设计阶段就要考虑到如何设计和创建索引. 1. 创建索引 创建索引的语法: CREATE [UNIQUE] INDEX [schema.] index ON [schema.] table (column [ASC | DESC], column [ASC | DESC]...

实例讲解Linux系统中硬链接与软链接的创建

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

触发器实例讲解

SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分享下给大家. 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create T

PHP中”单例模式“实例讲解【转】

转自::http://www.cnblogs.com/hongfei/archive/2012/07/07/2580994.html 假设我们需要写一个类用来操作数据库,并同时满足以下要求: ①SqlHelper类只能有一个实例(不能多)②SqlHelper类必须能够自行创建这个实例③必须自行向整个系统提供这个实例,换句话说:多个对象共享一块内存区域,比如,对象A设置了某些属性值,则对象B,C也可以访问这些属性值(结尾的例子很好的说明了这个问题) 1 <?php 2 class SqlHelpe

SQL触发器实例讲解

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程.       常见的触发器有三种:分别应用于Insert , Update , Delete 事件. 我为什么要使用触发器?比如,这么两个表: Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )