`

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

阅读更多

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语言,不用第三方库) H264视频流文件转flv文件源码实现(C语言,不用第三方库) 附加flv解析工具 附加flv解析工具 ...

    h264封装flv-----flv-muxer

    根据FLV格式协议,实现支持h264裸视频流封装成FLV格式,音频也支持,只不过是在main中略作修改即可。

    实现ffmpeg将RTSP流封装成mp4、avi、flv文件的源码

    实现ffmpeg将RTSP流封装成mp4、avi、flv文件的源码,也只封装格式转换,希望对你有用.........

    ffmpeg.exe 支持flv h265封装

    支持flv h265封装的文件播放以及http-flv-h265流的获取。视频文件在上传的另一个资源中

    将rtmp流保存成MP4或者flv格式视频(参考资料包括:librtmp实现flv,ffmpeg实现MP4和mp4v2实现MP4)

    参考资料,主要实现包括利用librtmp实现rtmp流的接收,并保存成flv格式视频;利用ffmpeg接口实现rtmp流保存成.ts, .mkv, .flv, .mp4格式视频; mp4v2源码及封装

    FLV格式封装过滤器源代码

    一个flv格式的directshow封装过滤器器,支持aac,h264视频封装成为flv流或文件的过滤器,用到directshow流媒体开发中。

    FLV封装格式分析器(程序+源代码)

    自己做的FLV封装格式分析工具。可以分析FLV中每个Tag的信息。 此外还支持分离FLV时的视频流和音频流。 本着开源的原则,包含了源代码。工程使用VC2010和MFC开发完成。

    flv.js demo,带视频,可直接使用

    它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。 内附mp4测试视频,切记,代码中由http请求,即项目必须...

    Java视频转换FLV

    Java视频转换FLV。 包括ffmpeg使用方法,ffmpeg抓取图片,和详细说明。

    C/C++音视频实战-gb28181系列-pjsip-sip栈-h264安防流媒体服务器

    音视频技术涉及广泛。包括语音信号处理、数字图像处理、...3、然后我们就可以学习音视频的基础知识了:RGB、YUV像素数据处理、PCM音频采样、H.264音视频码流解析以及Android平台多媒体相关如:Camera、AudioTrack、Ope

    H264 FAAC音视频采集编码,并经由Rtmp发布测试代码

    H264 FAAC音视频采集编码,并经由Rtmp发布测试代码 1. 采用DirectShow实现摄像头视频数据和音频数据的采集 2. 采用x264/faac实现音视频的编码 3. 采用librtmp实现编码后音视频数据到Rtmp流媒体服务器的发布 4. 实际...

    视频格式转换帮助类C#实现

    1. MPEG-4:一种常用的视频压缩标准,包括MP4、AVC(H.264)、HEVC(H.265)等。 2. AVI(Audio Video Interleave):由微软开发的一种多媒体容器格式,支持多种编码格式,如DivX、Xvid等。 3. WMV(Windows Media...

    flv.min.js

    它的工作原理是 Flv.js 在 JavaScript 中流式解析 flv 文件流,并实时转封装为 fmp4 ,通过 Media Source Extensions 喂给浏览器,实现了 FLV 格式视频的播放。 flv插件可以直接运行js转换html5,可以直接引入项目...

    FLV封装格式分析器 1.1 (源代码)

    自己做的FLV封装格式分析工具。可以分析FLV中每个Tag的信息。 此外还支持分离FLV时的视频流和音频流。工程使用VC2010和MFC开发完成。

    Android_RTMP博客资料

    【Android RTMP】安卓直播推流总结 ( 直播服务器搭建 | NV21 图像采集 | H.264 视频编码 | PCM 音频采集 | AAC 音频编码 | RTMP 包封装推流 ) https://hanshuliang.blog.csdn.net/article/details/106863889 001_...

    FLV文件数据结构以及读取其脚本信息的代码

    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...

    赛事制作技术之视频直播技术.pptx

    图像采集图像的采集过程主要由摄像头等设备拍摄成YUV编码的原始数据,然后经过编码压缩成H.264等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB和WebM等。; ...

    本地音视频文件转HLS流直播

    将本地音视频文件转为hls流进行直播,支持mp4、flv、avi等h264封装的文件,手机微信或qq可直接观看

Global site tag (gtag.js) - Google Analytics