Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495202
  • 博文数量: 135
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 905
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-24 19:31
文章分类

全部博文(135)

文章存档

2010年(135)

我的朋友

分类: LINUX

2010-09-02 18:57:56

FLV全称为 Flash Video,这种视频格式成为互联网“新宠”,在此之前可能还是wmv/rm的最多。FLV文件格式在互联网上的应用方便造就了youtube的神话。从 2006年我就一直关注Flash Video方面的东西,曾经编码把FLV文件格式解析了。非常有意思,我把FLV文件中关键帧提取出来,扔给flash video的播放器,仍然可以播放,速度很快,但是就是让人感觉在放幻灯片。今天把以前解析FLV文件格式程序和文档整理了一下,把FLV文件格式详细的 整理出来。下面用类似于文法规则的方法把FLV文件格式表示出来。
FLV文件: FLVHeader FLVStream
FLVHeader : Signature Version Flags Offset
Signature : "FLV"
Version   : 0×01
Flags   : 0×01 | 0×04 | 0×05 //1:video,4:audio,5:video+audio
Offset   : 0×00 0×00 0×00 0×09
FLVStream : (PreviousTagSize FLVTag)*
PreviousTagSize : 4个byte表示int(第一个FLVTag,该值为0,一般第一个Tag是Meta)
FLVTag    : Type BodyLength Timestamp TimestampExtended StreamId Body
Type      : 0×08 | 0×09 | 0×12 //0×08:audio,0×09:video,0×12:meta
BodyLength: 3个byte表示int
Timestamp : 3个byte表示int
TimestampExtended : 0×00 (一般是0×00)
StreamId  : 0×00 0×00 0×00
Body      : BodyLength个byte
上面基本上就是整个FLV文件的格式信息。有一点非常重要:这上面“4个byte表示int”
与"3个byte表示int”都是高->低字节序的。在计算机中,大部分是低->高字节序,
在解析时候一定要注意转换。

对于具体三种Tag:Audio/Video/Meta,
其Body里又有不同格式。Meta Tag的Body是两个AMF packets(如果懂一点Flash的话,
应该知道AMF packet大概是个什么东东,这个的格式我下次在仔细贴出来。)
Audio Tag和Video Tag的Body的第一个byte都用来标识一些与后面数据相关的信息。

Audio Tag的Body的第一个字节信息:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0   bit从高到底
——(1)—–|–(2)–|(3)|(4)
(1):0–Uncompressed; 1–ADPCM; 2–MP3; 5–Nellymoser 8kHz mono; 6–Nellymoser
(2):0–5.5KHz; 1–11KHz; 2–22KHz; 3–44KHz
(3):0–8bit; 1–16bit
(4):0–mono; 1–stereo

Video Tag的Body的第一个字节信息:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0   bit从高到底
—–(1)——|——(2)—–
(1):2–Sorensen H.263; 3–Screen video; 4–On2 VP6; 5–On2 VP6 Alpha; 6–ScreenVideo 2
(2):1–keyframe; 2–inter frame; 3–disposable inter frame

阅读(1734) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-05 14:48:44

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com