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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值