FLV格式解析

简介: FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。

简介


FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。


FLV是流媒体封装格式,我们可以将其数据看为二进制字节流。总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。



用到资源文件:


FLV格式解析


先来一张图,这是《科比退役演讲》下载)的一个FLV视频。我使用的是UltraEdit的二进制查看工具。



header



头部分由一下几部分组成 Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)


  • signature 占3个字节 固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。图中0x46 0x4C 0x56,代表FLV
  • Version 占1个字节 标示FLV的版本号。这里我们看到是1
  • Flags 占1个字节 内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。截图看到是0x05,也就是00000101,代表既有视频,也有音频。
  • DataOffset 4个字节 表示FLV的header长度。这里可以看到固定是9


Body


FLV的body部分是一系列的back-pointers+tag构成的


  • back-pointers固定4个字节,表示前一个tag的size
  • tag分三种类型:video,audio,scripts.


tag组成


tag type+tag data size+Timestamp+TimestampExtended+stream id+ tag data


  • type 1个字节。8为Audio,9为Video,18为scripts
  • tag data size 3个字节。表示tag data的长度。从streamd id 后算起。
  • Timestreamp 3个字节。时间戳
  • TimestampExtended 1个字节。时间戳扩展字段
  • stream id 3个字节。总是0
  • tag data 数据部分


图上第一个tag:


  • type=0x12=18,表示是一个scripts,FLV中,header后的第一个tag是script tag,script tag内容是amf格式数据,包含两个amf.
  • size=0x00 0x01 0x74 = 372
  • timpestreamp = 0x00 0x00 0x00
  • TimestampExtended=0x00
  • streamid=0x00 0x00 0x00
  • tag data部分:



tag的划分


图中红色部分是我标出"("与")"前后的的两个back-pointers,都是4个字节。而括号中间就是第一个TAG。那是怎么计算的呢?我们就以这个做个示例。


  • 首先第一个back-pointers是0x00000000,那是因为后面是第一个TAG。所以他为0。
  • 然后根据我们我们前面格式获取到size是0x00 0x01 0x74 = 372。也就是说从stream id后面再加上372个字节就到了第一个TAG的末尾,我们数一下。tag header有11个字节。那么到第一个TAG,总共有372+11=383=0x17f。
  • 接下来我们找到0x17f的地址,从工具上很容易找到,正好就是后括号")"的前面。红0x00 0x00 0x01 0x7F=372,这代表的是上一个TAG的大小。
  • 最后我们计算一下,上一个TAG数据部分是372个字节,前面type、stream id等字段占了11个字节。正好是匹配的。 上面我们已经知道了怎么取划分每个TAG。接下来我们就看TAG的具体内容:


tag的内容


前面已经提到tag分3种。我们一个个看


script


脚本Tag一般只有一个,是flv的第一个Tag,用于存放flv的信息,比如duration、audiodatarate、creator、width等。 首先介绍下脚本的数据类型。所有数据都是以数据类型+(数据长度)+数据的格式出现的,数据类型占1byte,数据长度看数据类型是否存在,后面才是数据。


一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型(srs返回为object类型),这个数组中包含了音视频信息项的名称和值。具体说明如下


类型 说明
0 Number type 8 Bypte Double
1 Boolean type 1 Bypte bool
2 String type 后面2个字节为长度
3 Object type
4 MovieClip type
5 Null type
6 Undefined type
7 Reference type
8 ECMA array type 数组,类似Map
10 Strict array type
11 Date type
12 Long string type 后面4个字节为长度



上图为第一个AMF包


  • type=0x02对应String
  • size=0A=10
  • value=onMetaData 正好是10个字节。



上图为第二个AMF


  • type=0x08 对应ECMA array type。


表示数组,类似Map。后面4个字节为数组的个数。然后是键值对,第一个为键,2个字节为长度。后面跟具体的内容。接着3个字节表示值的类型,然后根据类型判断长度。 上图我们可以判断,总共有13个键值对。 第一个长度为8个字节是duration。值类型是0x004073,第一个字节是00,所以是double,8个字节。 第二个长度5个字节是width。值也是double类型,8个字节。 依次解析下去...


Audio






视频中第二个tag为音频tag


stream-id之后:


  • 前4位为音频格式


类型
0 Linear PCM, platform endian
1 ADPCM
2 MP3
3 Linear PCM, little endian
4 Nellymoser 16-kHz mono
5 Nellymoser 8-kHz mono
6 Nellymoser
7 G.711 A-law logarithmic PCM
8 G.711 mu-law logarithmic PCM
9 reserved
10 AAC
11 Speex
14 MP3 8-Khz
15 Device-specific sound


  • 接着2位为采样率(对于AAC总是3)


类型
0 5.5-kHz
1 11-kHz
2 22-kHz
3 44-kHz


  • 接着1位为采样的长度(压缩过的音视频都是16bit)


类型
0 snd8Bit
1 snd16Bit


  • 接着1位为音频类型(对于AAC总是1)


类型
0 sndMono
1 sndStereo


video


由于kobe视频音频编码是pcm,查找视频tag太难,使用<<东风破>> mv视频



  • type=0x09=9。这里应该是一个video。
  • size=0x000030=48。长度为48。
  • timestreamp=0x000000。
  • TimestampExtended =0x00。
  • stream id =0x000000


我们看到数据部分: 视频信息+数据 视频信息,1个字节。


StreamId之后的数据就表示是VideoTagHeader,如果是avc,VideoTagHeader会多出4个字节的信息就是AVCPacketType和CompositionTime


  • 前4位为帧类型Frame Type


类型
1 keyframe (for AVC, a seekable frame) 关键帧
2 inter frame (for AVC, a non-seekable frame)
3 disposable inter frame (H.263 only)
4 generated keyframe (reserved for server use only)
5 video info/command frame


  • 后4位为编码ID (CodecID)


类型
1 JPEG (currently unused)
2 Sorenson H.263
3 Screen video
4 On2 VP6
5 On2 VP6 with alpha channel
6 Screen video version 2
7 AVC


特殊情况 视频的格式(CodecID)是AVC(H.264)的话,VideoTagHeader会多出4个字节的信息,AVCPacketType 和CompositionTime。


  • AVCPacketType 占1个字节


类型
0 AVCDecoderConfigurationRecord(AVC sequence header)
1 AVC NALU
2 AVC end of sequence (lower level NALU sequence ender is not required or supported)


AVCDecoderConfigurationRecord.包含着是H.264解码相关比较重要的sps和pps信息,再给AVC解码器送数据流之前一定要把sps和pps信息送出,否则的话解码器不能正常解码。而且在解码器stop之后再次start之前,如seek、快进快退状态切换等,都需要重新送一遍sps和pps的信息.AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个video tag.


  • CompositionTime 占3个字节


条件
AVCPacketType ==1 Composition time offset
AVCPacketType !=1 0


再看到第二个video tag



我们看到 AVCPacketType =1,而后面三个字节为000043。这是一个视频帧数据。 解析到的数据完全符合上面的理论。


sps pps 前面我们提到第一个video 一般存放的是sps和pps。这里我们具体解析下sps和pps内容。先看下存储的格):


0x01+sps[1]+sps[2]+sps[3]+0xFF+0xE1+sps size+sps+01+pps size+pps


sps[1]=0x64 sps[2]=00 sps[3]=0D sps size=0x001B=27(占两个字节) 跳过27个字节后,是0x01 pps size=0x0005=118(占两个字节) 跳过5个字节,就到了back-pointers。


视频帧数据 解析出sps和pps tag后,后面的video tag就是真正的视频数据内容了



这是第二个video tag其实和之前图一样,只是我圈出来关键信息。先看下格式 frametype=0x17=00010111 AVCPacketType =1 Composition Time=0x000043 后面就是NALU DATA


用:


flv格式详解+实例剖析


FLV视频封装格式详解


【总结】FLV(AAC/AVC)学习笔记


将h.264视频流封装成flv格式文件(一.flv格式)


将h.264视频流封装成flv格式文件(二.开始动手)


RTMP协议中的AMF数据


rtmp协议简单解析以及用其发送h264的flv文件


FLV 文件格式解析


(原)从mp4,flv文件中解析出h264和aac,送解码器解码失败:,avc1与H264区别在这里其实有人遇到了和我一样的问题:stackoverflow.com/questions/1…


simplest_mediadata_test


rtmp_relayRtmpMindmap


16fbc8ab56105fdf~tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.jpg

目录
相关文章
|
8月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
9月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1359 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
267 1
|
Go
golang解析excel、csv编码格式
golang解析excel、csv编码格式
152 4
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
JSON 安全 前端开发
解析FormData格式数据:Python实践指南
解析FormData格式数据:Python实践指南
750 1
|
存储 SQL 关系型数据库
MySQL行格式原理深度解析
MySQL行格式原理深度解析
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
610 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
180 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS