`

将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

分享到:
评论

相关推荐

    将H.264封装成FLV(C语言实现)

    在多媒体领域,H.264是一种...总之,将H.264封装成FLV涉及对两种格式的理解、NALU处理、FLV结构构建以及C语言编程技巧。通过实现这个过程,我们可以创建出适合网络流式传输的视频文件,满足各种在线视频平台的需求。

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

    标题中的“h264封装flv-----flv-muxer”指的是将H.264编码的视频流封装到FLV(Flash Video)容器格式的过程。这个过程由一个名为“flv-muxer”的工具或程序来完成。在本文中,我们将深入探讨H.264编码、FLV容器格式...

    H264视频流文件转flv文件源码实现(C语言,不用第三方库)

    H264视频流文件转flv文件源码实现(C语言,不用第三方库) H264视频流文件转flv文件源码实现(C语言,不用第三方库) H264视频流文件转flv文件源码实现(C语言,不用第三方库) 附加flv解析工具 附加flv解析工具 ...

    H.264转flv代码示例

    描述中提到的问题——黑屏,通常是因为在将H.264编码的视频流封装到FLV容器时,元数据处理不当或丢失。元数据包含了关键帧的位置和解码顺序等重要信息,如果缺失或错误,可能会导致播放器无法正确解码和显示视频。 ...

    C++实现h264码流保存为FLV文件

    3. **处理FLV帧数据**:H264码流中的NAL单元需要被封装成FLV帧。每帧前会加上一个FLV Tag,标记数据类型(视频或音频)、时间戳以及数据长度。NAL单元需要先进行适当的重组和打包,以便适应FLV的格式要求。 4. **...

    h264流文件转化成flv的程序

    通过以上步骤,我们可以编写一个程序,将下载的H264流文件转换为FLV格式,使其能在Flash Player或者支持FLV的其他平台上播放。这个名为“h264toflv”的程序正是实现这一功能的工具,用户可以根据需求对其进行修改或...

    flv格式h265编码视频

    FLV(Flash Video)格式是Adobe Systems开发的一种流媒体文件格式,主要用于在网络上分发视频内容。H.265/HEVC(High Efficiency Video Coding),全称高效视频编码,是新一代的视频编码标准,旨在在相同的视频质量...

    利用ffmpeg将H264裸流文件封装为MP4文件并保存

    总结来说,利用FFmpeg将H264裸流文件封装为MP4文件是一项基础但实用的操作,对于处理多媒体数据非常关键。通过熟悉FFmpeg的命令行语法和功能,你可以轻松实现各种多媒体文件的转换和处理。在压缩包"ffmpeg-h264ToMp4...

    实时流合成为flv文件

    FLV(Flash Video)格式是Adobe Systems用于互联网视频流的一种容器格式,它支持H.264视频编码和AAC音频编码,因此在处理实时视频流时非常适用。本篇文章将深入探讨如何将接收到的H.264和AAC码流数据合成为FLV文件,...

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

    在本文中,我们将深入探讨如何使用FFmpeg将RTSP(Real-Time Streaming Protocol)流封装成MP4、AVI和FLV文件。RTSP是一种用于控制实时流传输的应用层协议,而FFmpeg则提供了将这种实时流转换为不同容器格式的能力。 ...

    MP4封装FLV工具

    总的来说,MP4封装FLV工具是一种实用的视频处理软件,它帮助用户将适合网络传输的H.264+AAC编码的MP4文件转换为FLV格式,适用于那些仍然依赖FLV格式的在线视频平台或者需要优化视频播放效率的场景。了解这种工具的...

    FLV视频封装格式详解.pdf

    FLV(Flash Video)是一种流媒体视频封装格式,它由Adobe公司设计开发,最初与Flash播放器紧密集成,使得它在互联网上得到了广泛的应用。FLV格式以其文件体积小巧、封装播放简便的特点,非常适合网络传输,并已成为...

    视频ES数据加密方案-H.264+H.265编码.docx

    本方案旨在针对H.264和H.265两种主流视频编码格式,提出一种高效且安全的数据加密方案。此方案不仅能够确保视频数据的安全性,还能兼容当前主流的封装格式如FLV、TS、HLS等,以适应不同的应用场景。 #### 二、视频...

    网络FLV格式转H.263格式的转换工具

    5. **封装**:将编码后的视频和音频数据封装成H.263格式的容器,可能采用MPG、AVI或其他支持H.263编码的文件格式。 6. **保存输出**:最后,工具将转换后的文件保存到用户指定的位置,文件名可能是“flv2h263”。 ...

    IOS 下 H264封装FLV 源代码

    总之,iOS平台上的H264到FLV封装是一个涉及编码理解、文件格式解析和系统API集成的过程。通过分析并利用"IOS.H264ToFlv"源代码,开发者可以学习如何在iOS环境中有效地处理视频编码和流媒体技术。

    h.264资料pdf

    2. **封装**:编码后的H.264比特流需要封装成特定的容器格式,如MP4、FLV或TS,以便于在网络上传输。 3. **传输协议**:选择合适的流媒体传输协议,如RTMP(Real Time Messaging Protocol)、HLS...

    IOS封装H264为FLV

    在iOS平台上,将H264编码的视频流封装成FLV格式是一项常见的任务,尤其在实时流媒体或网络视频传输领域。H264是一种高效、高质量的视频编码标准,而FLV(Flash Video)则是一种广泛用于互联网的视频容器格式,特别...

    视频格式测试资源,包含多种格式 ogg/mp4/rmvb/webm/avi/mkv/mov/rmvb/flv/h264/h265

    6. **mkv**:Matroska是另一种开放源代码的多媒体容器格式,它可以封装多种音视频流和字幕,同时具有跨平台的兼容性。MKV支持的编解码器种类多,常被用作高清视频分享。 7. **mov**:QuickTime Movie,由Apple公司...

    RTSP协议服务端代码,H264视频流直播

    本项目提供的是一个RTSP服务端的代码实现,使用C++语言编写,支持H264编码的视频流播放,并采用了非阻塞多线程技术来提高性能和效率。 在RTSP服务端,主要涉及以下几个关键知识点: 1. **RTSP协议**:RTSP协议提供...

Global site tag (gtag.js) - Google Analytics