rtmpdump

16 篇文章 0 订阅
7 篇文章 0 订阅

//2015-3-1    rtmpdump   Hi3518Z

rtmpdump 此项目是第一个突破RTMPE加密协议的,但因为破解了RTMPE所以惹恼了ADOBE,这个开源项目在SourceForge里已经没有了。但是作者的页面还保留有链接和代码。


AMF3用作Flash Playe 9的ActionScript 3.0的默认序列化格式,而AMF0则用作旧版的ActionScript 1.0和2.0的序列化格式。 

基本的操作如下文所述。
RTMP_Alloc() :用于创建一个RTMP会话的句柄。
RTMP_Init():初始化句柄。
RTMP_SetupURL():设置会话的参数。
RTMP_Connect():建立RTMP链接中的网络连接(NetConnection)。
RTMP_ConnectStream():建立RTMP链接中的网络流(NetStream)。
RTMP_Read():读取RTMP流的内容。
客户端可以在调用RTMP_Connect()之前调用RTMP_EnableWrite(),然后在会话开始之后调用 RTMP_Write()。
RTMP_Pause():流播放的时候可以用于暂停和继续
RTMP_Seek():改变流播放的位置
当RTMP_Read()返回0 字节的时候,代表流已经读取完毕,而后可以调用RTMP_Close()
RTMP_Free():用于清理会话。
rtmp[t][e|s]://hostname[:port][/app[/playpath]]
 
RTMP_SetupURL()使用的一个例子字符串:
"rtmp://flashserver:1935/ondemand/thefile swfUrl=http://flashserver/player.swfswfVfy=1"

//十分钟(600 秒)后在home目录,你将得到一个视频文件,“rt.flv”。  
./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 60


Rtmp协议是包头加包体(数据)组成,包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s)。包头包含了head type、时间戳、amf size、amf type、streamID。
Head_Type的后面6个Bit和StreamID决定了ChannelID。  StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
例如在rtmp包里面经常看到的0xC2,就表示一字节的包头,channel=2.
RTMP_Header[12 8 4 1B]
RTMP_Body  [V:4/A:1]B  VideoTagHeader RTMP_Header[12 8 4 1B]+AMF[] videopayload
IF AVCPacketType == 0 AVCDecoderConfigurationRecord(AVC sequence header)
IF AVCPacketType == 1 One or more NALUs (Full frames are required)
AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个 video tag.


_rtmpdump   //http://rtmpdump.mplayerhq.hu/
make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/rtmpdump/android-toolchain/sysroot/include" CRYPTO=POLARSSL
make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/home/compiler/rtmpdump/android-toolchain/sysroot/include" CRYPTO=POLARSSL SHARED=
make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes 
make SYS=posix
flasm -x file.swf

make CRYPTO=
//ARM
make CROSS_COMPILE=arm-hisiv100nptl-linux- CRYPTO= INC="-I/home/oem_root/TH38E3/include" XLIBS="-L/home/oem_root/TH38E3/lib"

//zlib-1.2.8.tar.gz  configure添加行 CHOST=arm-hisiv100nptl-linux  
./configure  --prefix=/home/oem_root/TH38E3

LIB_GNUTLS=-lgnutls -lgcrypt
LIB_OPENSSL=-lssl -lcrypto
LIB_POLARSSL=-lpolarssl



librtmp依赖于openssl和zlib

http://202.120.197.10/
http://202.106.125.17:80


./rtmpdump -r "rtmp://URL" -o filename.flv --resume
./rtmpdump -r "rtmp://URL" -o filename.flv
./rtmpdump -r rtmp://0.0.0.0/live/test -v -o  test.flv


error:./rtmpdump -r rtmp://192.168.10.40:1936/live/str0010 -z   -v
抓去实时流
rtmpdump.exe -r rtmp://192.168.17.7/live/1111 -v -o 111.flv
-r url参数
-v 是否为直播 
-o 保存的文件


C++ RTMP Server 源码下载页面:http://trac.rtmpd.com/browser
svn co --username anonymous --password "" https://svn.rtmpd.com/crtmpserver/trunk crtmpserver

通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServe
FMS, Red5, crtmpserver等


6782 32.138252000 192.168.66.51 192.168.66.48 RTMP 131 Handshake C0+C1
6789 32.139043000 192.168.66.48 192.168.66.51 RTMP 130 Handshake S0+S1+S2
6792 32.139164000 192.168.66.51 192.168.66.48 RTMP 130 Handshake C2

AMFType/Type ID
Type ID: Set Chunk Size (0x01)
Type ID: AMF0 Command (0x14)
Type ID: User Control Message (0x04)
Type ID: Window Acknowledgement Size (0x05)
Type ID: Set Peer Bandwidth (0x06)
Type ID: AMF0 Data (0x12)
Type ID: Video Data (0x09)
Type ID: Audio Data (0x08)


Head_Type的后面6个Bit和StreamID决定了ChannelID。  StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5


RTMP数据类型 +AMF0数据类型
Shared Object 数据类型
RTMP包结构就是使用了AMF格式.
包头可以是下面4种长度的任意一种:12, 8, 4, or 1 byte(s).
RTMP解码
FMS3中为了实现H.264数据的直播而增加了一个数据类型,这个类型的值为0x16,这个类型不在下表中,如果需要请参看http://www.cnweblog.com/fly2700/archive/2009/02/06/297957.html

RTMP协议就像一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视/音频数据.
一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.
网络连接(Connection)
一个Actionscript连接并播放一个流的简单代码:
var videoInstance:Video = your_video_instance;
var nc:NetConnection = new NetConnection();
var connected:Boolean = nc.connect("rtmp:/localhost/myapp");
var ns:NetStream = new NetStream(nc);
videoInstance.attachVideo(ns);
ns.play("flvName");
默认端口为1935

AMF0数据的嵌套关系如下:
Object={ObjType + ObjValue}
CORE_BOOLEAN={Value(1 Byte)}
CORE_NUMBER={Value(8 Byte)}
CORE_String={StringLen(2 Byte) + StringValue(StringLen Byte)}
CORE_DATE={value(10 Byte)}
CORE_Array={ArrayLen(4 Byte) + Object}
CORE_Map={MapNum(4 Byte) + CORE_Object}
CORE_Object={CORE_String + Object}


类型说明(ObjType) 数据 dataSize
CORE_String 0x02 2字节 (2字节的数据纪录了String的实际长度)
CORE_Object 0x03 0字节(开始嵌套0x00000009表示嵌套结束)
NULL     0x05 0字节 空字节无意义
CORE_NUMBER   0x00   8字节
CORE_Map   0x08   4字节(开始嵌套)
CORE_BOOLEAN   0x01   1字节

//2015-3-17 add http://blog.csdn.net/darkdragonking/article/details/40656923
RTMP_ReadPacket 跟Send类似,函数比较长,基本是处理RTMP数据包RTMPPacket的包头,包体的读写等碎碎代码。真正处理事件的函数为RTMP_ClientPacket。
 
RTMP_ClientPacket函数是一个很大的数据包分发器。负责将不同类型m_packetType的数据包传递给对应的函数进行处理。比如:


RTMP_PACKET_TYPE_CHUNK_SIZE 块大小设置消息 HandleChangeChunkSize;
RTMP_PACKET_TYPE_CONTROL 控制消息   HandleCtrl ;
RTMP_PACKET_TYPE_AUDIO    音频消息    HandleAudio;
RTMP_PACKET_TYPE_INFO   元数据设置消息  HandleMetadata;
RTMP_PACKET_TYPE_INVOKE 远程过程调用   HandleInvoke;
其中比较重要的是HandleInvoke 远程过程调用。其里面实际是个状态机。


case: _openssl
OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。


./Configure --prefix=/work/ssh/install/openssl-0.9.8e  os/compiler:arm-hismall-linux-gcc
AR=arm-linux-ar RANLIB=arm-linux-ranlib  CC=arm-linux-gcc 
/usr/bin/perl ./Configure shared linux-armv4 --prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/
os/compiler: 表示采用自定义平台,指定编译器
 
case: _openssh
./configure --host=arm-9tdmi-linux-gnu --with-libs --with-zlib=/work/ssh/install/zlib-1.2.3 
--with-ssl-dir=/work/ssh/install/openssl-0.9.8e --disable-etc-default-login CC=arm-hismall-linux-gcc AR=arm-hismall-linux-ar


### 回答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、付费专栏及课程。

余额充值