FLV文件格式分析
作者:Eric.wang ( 273578147@qq.com)
于 2012-04-04 14:43:45,转载请注明。
少点转载,多点原创。
最近做RTMP Client,费力很大功夫终于把H264码流推送到Red5服务器上,封装包的时候用到FLV文件格式,下面是结合FLV Format Specification进行的分析。
1. FLV文件对齐方式
FLV文件以大端对齐方式存放多字节整型。
如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。
如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。
2. FLV文件格式
FLV文件格式比较简单,分为Header和Body两部分。
即:|FLV_Header(9)|FLV_Body(n)|,括号里是长度,以byte为单位。
以下分别介绍Header和Body的具体内容格式。
3. FLV Header格式
FLV Body的内容长度是固定的,格式如下:
| F(8) | L(8) | V(8) | Version(8) | TypeFlagsReserved(5) | TypeFlagsAudio(1)| TypeFlagsReserved(1) | TypeFlagsVideo(1) | DataOffset(32) |.
可知FLV Header头部的长度为9 bytes。
前三个字节为FLV,十六进制表示为 0x46 0x4C 0x56。
Version为FLV的版本号,一般为0x01。
TypeFlagsReserved为保留位,均为0
TypeFlagsAudio为FLV文件中是否包括音频数据,1是有,0是没有。
TypeFlagsVideo为FLV文件中是否包括视频数据,1是有,0是没有。
DataOffset为FLV Header的长度,为固定值0x00000009。
4. FLV Body格式
FLV Body的内容为多个Tag和Tag的长度组成。
即:
| PreviousTagSize0(32) | Tag1(PreviousTagSize1) |PreviousTagSize1(32) | Tag2 | ……| PreviousTagSizeN-1(32) | TagN(previousTagSizeN)| previousTagSizeN(32) |
PreviousTagSize0为0x00000000。
Tag为每一个内容,目前包括音频、视频、脚本。
previousTagSize为前一个Tag的长度。
5. FLV Tag格式
FLV Tag是FLV Body的内容,具体Tag同样是由Tag Header和Tag Data组成。
即FLV Tag Format :
| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |
TagType为Tag的类型:
目前支持的类型:
音频为0x08;
视频为0x09;
脚本数据为0x12。
DataSize为Data的长度。
Timestamp为相对第一个Tag的时间戳,因此第一个Tag的时间戳为0。也可以将所有Tag的时间戳全配置为0,解码器会自动处理。
StreamID为默认的全为0。
Data为具体的数据内容,
如果TagType=0x08,为AudioData;
如果TagType=0x09,为VideoData;
如果TagType=0x12,为ScriptDataObject,但该项因为内容不固定,所以在FLV文件中可以没有该Tag内容。
6. VideoData格式
VideoData的内容,同样包括VideoData Header和VideoData Body。
即VideoData Format:
Video Header = | FrameType(4) | CodecID(4) |
VideoData = | FrameType(4) | CodecID(4) | VideoData(n) |
FrameType为数据类型,1为关键帧,2为非关键帧,3为h263的非关键帧,4为服务器生成关键帧,5为视频信息或命令帧。
CodecID为包装类型,1为JPEG,2为H263,3为Screen video,4为On2 VP6,5为On2 VP6,6为Screen videoversion 2,7为AVC。
VideoData为数据具体内容:
如果CodecID=2,为H263VideoPacket;
如果CodecID=3,为ScreenVideopacket;
如果CodecID=4,为VP6FLVVideoPacket;
如果CodecID=5,为VP6FLVAlphaVideoPacket;
如果CodecID=6,为ScreenV2VideoPacket;
如果CodecID=7,为AVCVideoPacket;
7. AVCVideoPacket格式
AVCVideoPacket同样包括Packet Header和Packet Body两部分:
即AVCVideoPacket Format:
| AVCPacketType(8)| CompostionTime(24) | Data |
AVCPacketType为包的类型:
如果AVCPacketType=0x00,为AVCSequence Header;
如果AVCPacketType=0x01,为AVC NALU;
如果AVCPacketType=0x02,为AVC end ofsequence
CompositionTime为相对时间戳:
如果AVCPacketType=0x01, 为相对时间戳;
其它,均为0;
Data为负载数据:
如果AVCPacketType=0x00,为AVCDecorderConfigurationRecord;
如果AVCPacketType=0x01,为NALUs;
如果AVCPacketType=0x02,为空。
8. AVCDecorderConfigurationRecord格式
AVCDecorderConfigurationRecord包括文件的信息。
具体格式如下:
| cfgVersion(8) | avcProfile(8) | profileCompatibility(8) |avcLevel(8) | reserved(6) | lengthSizeMinusOne(2) | reserved(3) | numOfSPS(5) |spsLength(16) | sps(n) | numOfPPS(8) | ppsLength(16) | pps(n) |
未完,待续...
转载自:http://www.cnblogs.com/ericdev/archive/2012/03/11/2390532.htmljavascript:mctmp(0);
相关推荐
纯java代码实现各种视频转flv格式,支持在线播放。不依赖第三方jar包,转码效率高,速度快。
这个是安装版本,支持flv格式转AVI格式 AVI格式转flv格式,是flv与AVI互换的一个转换器,希望你能喜欢。 说明,其中,avi转FLV时,如果用custom转换不出来,请用默认格式就可以了。
可以把各种格式的视频转化成各种品质flv。压缩包附带ffmpeg.exe,下载后直接可用。 带那么详细的注释,如果还用不好,我也没什么可说的了。
Bigasoft FLV Converter是一款FLV视频转换工具,它可以将其他视频格式,如MP4/AVI/等直接转换为FLV格式,反过来也可以将FLV转为AVI/MP4等格式,其使用方法非常简单,软件界面上有详细的操作说明。即使你是新手也...
2FLV:将任意视频格式转换成FLV格式的工具 ┆V1.1 汉化版
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等), ...再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
一款绿色版的QSV转FLV格式转换器,版本号V2.2。本软件仅用于学习交流。QSV是一种缓存文件,只能使用其专用播放器进行播放,如果想转换到其他格式,就必须要用到这个视频转换器。除了转换单个文件外,还可以添加批量...
如何快速不借用转换工具将FLV格式视频转换成MP4,请查阅
java实现rtsp/rtmp转m3u8/flv/hls/mp4等实现web直播和回放,对海康/大华等硬盘录像兼容,也可以直接对接摄像头
flv转换器可转换MP3,MP4,MP5,CD,DVD,MPEG,SWF等多种格式
几乎所有格式都可以用它转换为FLV格式。我试验过,很好用的装备。但是不能实现互转世唯一的失误!
flv格式可转换成其他视频格式
视频转换为flv格式 flash播放
转换xv格式 迅雷的xv格式必须要用迅雷看看才可以打开的 ,但是有软件可以转换其格式的
可以将flv转为mp3,适合于网上下载flv文件转换成mp3来听。
FLV2MPG flv转mpg格式 flv mpg
该软件支持所有视频格式文件转换为flv格式
FLV格式转MP3工具FLV格式转MP3工具FLV格式转MP3工具
批量转换xv到flv格式,可以直接按文件夹来转换,不必一个个转了
aspx.net C# 视频Flv格式 在线转换 播放 源码