flv文件的格式其实网上资料还是不少,但是怎么封装成flv却不多。看了不少资料,找到了一个觉得还比较靠谱的:http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html
其实flv还是挺简单的一个视频格式,下面就来先谈一谈FLV的格式吧。
FLV是一个二进制文件,简单来说,其是由一个文件头(FLV header)和很多tag组成(FLV body)。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流,而每个tag又由tag header和tag data组成。
文件头由9bytes组成
前3个bytes是文件类型,总是“FLV”,也就是(0x46 0x4C 0x56)。第4btye是版本号,目前一般是0x01。第5byte是流的信息,倒数第一bit是1表示有视频(0x01),倒数第三bit是1表示有音频(0x4),有视频又有音频就是0x01 | 0x04(0x05),其他都应该是0。最后4bytes表示FLV 头的长度,3+1+1+4 = 9。
FLV header后面就是FLV body,FLV body由若干个tag 组成。每一个tag第一部分是tag header,tag header长度为11bytes,但是每个tag header前面有4bytes记录着上一个tag的长度,此待会儿再说。tag header的第1个byte为记录着tag的类型,音频(0x8),视频(0x9),脚本(0x12);第2到4bytes是数据区的长度,也就是tag data的长度;再后面3个bytes是时间戳,单位是毫秒,类型为0x12则时间戳为0,时间戳控制着文件播放的速度,可以根据音视频的帧率类设置;时间戳后面一个byte是扩展时间戳,时间戳不够长的时候用;最后3bytes是streamID,但是总为0,再后面就是数据区了(tag data),也即是h264的裸流,tag header 长度为1+3+3+1+3=11。
0x12前面的00 00 00 00 就是刚刚说的记录着上一个tag的长度的4bytes,这里因为前面没有tag,所以为0。
tag data如果是音频数据,第一个byte记录audio信息:
前4bits表示音频格式(全部格式请看官方文档):
·0 -- 未压缩
·1 -- ADPCM
·2 -- MP3
·4 -- Nellymoser 16-kHz mono
·5 -- Nellymoser 8-kHz mono
·10 -- AAC
下面两个bits表示samplerate:
·0 -- 5.5KHz
·1 -- 11kHz
·2 -- 22kHz
·3 -- 44kHz
下面1bit表示采样长度:
·0 -- snd8Bit
·1 -- snd16Bit
下面1bit表示类型:
·0 -- sndMomo
·1 -- sndStereo
之后是数据。
如果是视频数据,第一个byte记录video信息:
前4bits表示类型:
·1-- keyframe
·2 -- inner frame
·3 -- disposable inner frame (h.263 only)
·4 -- generated keyframe
后4bits表示解码器ID:
·2 -- seronson h.263
·3 -- screen video
·4 -- On2 VP6
·5 -- On2 VP6 with alpha channel
·6 -- Screen video version 2
·7 -- AVC (h.264)
之后是数据。
如果是AAC和AVC的音视频,则在放入数据前有一个音频和视频的配置信息需要写入前两个tag,等会再说。之前说每个tag前面会有一个记录上个tag长度的4个bytes(previous tag size),整个的flv文件其实是:FLV header + previous tag size0 + tag1 + previous tag size1 + tag2 + previous tag size2 + ... +tagN + previous tag sizeN。第一个previous tag size因为前面没有tag,所以为0,其他的总是记录着前面一个tag 长度(tag data size + tag header size)。
如果tag data是脚本数据,Script Tag Data,该类型Tag又通常被称为Metadata(元数据) Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个 AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解。
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串,其他值表示意义请查阅文档。
第2-3个字节为UI16类型值,表示字符串的长度,一般总是0x000A(“onMetaData”长度)。
后面字节为字符串数据,一般总为“onMetaData”。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。
第2-5个字节为UI32类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:
第1-2个字节表示元素名称的长度,假设为L。
后面跟着为长度为L的字符串。
第L+3个字节表示元素值的类型。
后面跟着为对应值,占用字节数取决于值的类型。
到此flv格式的解析就差不多了,如有写错的地方请指出。
附上一个网友写的flv的查看工具:http://download.csdn.net/detail/yeyumin89/4534822
http://blog.csdn.net/yeyumin89/article/details/7932368
相关推荐
H264视频流文件转flv文件源码实现(C语言,不用第三方库) H264视频流文件转flv文件源码实现(C语言,不用第三方库) H264视频流文件转flv文件源码实现(C语言,不用第三方库) 附加flv解析工具 附加flv解析工具 ...
根据FLV格式协议,实现支持h264裸视频流封装成FLV格式,音频也支持,只不过是在main中略作修改即可。
实现ffmpeg将RTSP流封装成mp4、avi、flv文件的源码,也只封装格式转换,希望对你有用.........
支持flv h265封装的文件播放以及http-flv-h265流的获取。视频文件在上传的另一个资源中
参考资料,主要实现包括利用librtmp实现rtmp流的接收,并保存成flv格式视频;利用ffmpeg接口实现rtmp流保存成.ts, .mkv, .flv, .mp4格式视频; mp4v2源码及封装
一个flv格式的directshow封装过滤器器,支持aac,h264视频封装成为flv流或文件的过滤器,用到directshow流媒体开发中。
自己做的FLV封装格式分析工具。可以分析FLV中每个Tag的信息。 此外还支持分离FLV时的视频流和音频流。 本着开源的原则,包含了源代码。工程使用VC2010和MFC开发完成。
它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。 内附mp4测试视频,切记,代码中由http请求,即项目必须...
Java视频转换FLV。 包括ffmpeg使用方法,ffmpeg抓取图片,和详细说明。
音视频技术涉及广泛。包括语音信号处理、数字图像处理、...3、然后我们就可以学习音视频的基础知识了:RGB、YUV像素数据处理、PCM音频采样、H.264音视频码流解析以及Android平台多媒体相关如:Camera、AudioTrack、Ope
H264 FAAC音视频采集编码,并经由Rtmp发布测试代码 1. 采用DirectShow实现摄像头视频数据和音频数据的采集 2. 采用x264/faac实现音视频的编码 3. 采用librtmp实现编码后音视频数据到Rtmp流媒体服务器的发布 4. 实际...
1. MPEG-4:一种常用的视频压缩标准,包括MP4、AVC(H.264)、HEVC(H.265)等。 2. AVI(Audio Video Interleave):由微软开发的一种多媒体容器格式,支持多种编码格式,如DivX、Xvid等。 3. WMV(Windows Media...
它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。 flv插件可以直接运行js转换html5,可以直接引入项目...
自己做的FLV封装格式分析工具。可以分析FLV中每个Tag的信息。 此外还支持分离FLV时的视频流和音频流。工程使用VC2010和MFC开发完成。
【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 ) https://hanshuliang.blog.csdn.net/article/details/106863889 001_...
FLV(Flash Video)是现在非常流行的流媒体格式,文件体积小巧、封装播放简单,目前主流视频网站的标清视频无一例外地使用了FLV格式。 本文详细介绍了FLV文件的数据结构,并在最后提供了读取FLV文件脚本信息的VB...
(3)H.264码流分析程序。可以分离并解析NALU。 (4)AAC码流分析程序。可以分离并解析ADTS帧。 (5)FLV封装格式分析程序。可以将FLV中的MP3音频码流分离出来。 (6)UDP-RTP协议分析程序。可以将分析UDP/RTP/MPEG-TS...
图像采集图像的采集过程主要由摄像头等设备拍摄成YUV编码的原始数据,然后经过编码压缩成H.264等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB和WebM等。; ...
将本地音视频文件转为hls流进行直播,支持mp4、flv、avi等h264封装的文件,手机微信或qq可直接观看