本文介绍一个自己的开源小项目:FLV封装格式分析器。FLV全称是Flash Video,是互联网上使用极为广泛的视频封装格式。像Youtube,优酷这类视频网站,都使用FLV封装视频。我这个项目规模不大,主要可以用来学习FLV封装格式结构。此外它还支持分离FLV中的视频流和音频流。使用VC 2010的MFC开发完成。在对FLV进行视音频分离的过程中,用到了一个Github开源小工程:flvparse。在此插一句:我发现Github上优秀的东西真的还是挺多的,许多零散的小工程,效果都很不错。这个flvparse做的就不错。
软件的exe以及源代码已经上传到了SourceForge上。和之前的H.264码流分析器一样,增加了一个英文界面,紧跟国际潮流~
项目地址:https://sourceforge.net/projects/flvformatanalysis/
CSDN下载地址(程序+源代码):http://download.csdn.net/detail/leixiaohua1020/6838805
更新记录==============================
1.1版(2014.7.8)
* 更换了界面
* 原工程支持Unicode编码
* 支持中英文切换
软件使用介绍
软件的使用相当简单。
软件运行后,首先打开一个FLV文件。单击“开始”,可以解析出一系列Tag,列表显示在软件右侧,不同种类的Tag被标记成了不同的颜色。软件的左侧,显示了FLV文件头信息,以及Tag头信息。
英文界面
注:如果勾选上“输出视频”,“输出音频”的话,可以输出分离后的视频流和音频流。在这里要注意的是音频支持MP3格式,AAC格式貌似有点问题。
软件源代码简析
源代码方面和普通的MFC程序差不太多,懂得MFC的人应该很快就能看懂。唯一比较特殊的地方,就在于对开源项目flvparse进行了一些改动,在此就不细说了。注释方面还是很充分的。
如果有什么使用问题,可以反馈给我,以后有时间进行修改升级。
更新(2014.8.12)================================
FLV封装原理
FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站如优酷网,土豆网,乐视网等网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。
总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。因此一个FLV文件是如图1结构。
图1.文件结构(简图)
其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。
图2.FLV文件结构(详图)
下面详细介绍一下三种Tag的Tag Data部分的结构。
(a)Audio Tag Data结构(音频Tag)
音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。结构如图3所示。
图3.Audio Tag Data结构
第1个字节的前4位的数值表示了音频编码类型。如表1所示。
表1.音频编码类型
值 |
含义 |
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 |
14 |
MP3 8-Khz |
15 |
Device-specific sound |
第1个字节的第5-6位的数值表示音频采样率。如表2所示。
表2.音频采样率
值 |
含义 |
0 |
5.5kHz |
1 |
11KHz |
2 |
22 kHz |
3 |
44 kHz |
PS:从上表可以发现,FLV封装格式并不支持48KHz的采样率。
第1个字节的第7位表示音频采样精度。如表3所示。
表3.音频采样精度
值 |
含义 |
0 |
8bits |
1 |
16bits |
第1个字节的第8位表示音频类型。
表4. 音频类型
值 |
含义 |
0 |
sndMono |
1 |
sndStereo |
(b)Video Tag Data结构(视频Tag)
视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。结构如图4所示。
图4.Video Tag Data结构
第1个字节的前4位的数值表示帧类型。如表5所示。
表5.帧类型
值 |
含义 |
1 |
keyframe (for AVC,a seekable frame) |
2 |
inter frame (for AVC,a nonseekable frame) |
3 |
disposable inter frame (H.263 only) |
4 |
generated keyframe (reserved for server use) |
5 |
video info/command frame |
第1个字节的后4位的数值表示视频编码类型。如表6所示。
表6.视频编码类型
值 |
含义 |
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 |
(c)Script Tag Data结构(控制帧)
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。结构如图5所示。
图5.Script Tag Data结构
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表7所示。
表7.常见MetaData
值 |
含义 |
duration |
时长 |
width |
视频宽度 |
height |
视频高度 |
videodatarate |
视频码率 |
framerate |
视频帧率 |
videocodecid |
视频编码方式 |
audiosamplerate |
音频采样率 |
audiosamplesize |
音频采样精度 |
stereo |
是否为立体声 |
audiocodecid |
音频编码方式 |
filesize |
文件大小 |
相关推荐
这个"FLV封装格式分析器"是一个专门用于解析和理解这种格式的工具,由个人开发者制作,并且开源,提供源代码供学习和研究。 FLV文件格式主要包括三个部分:文件头、文件体和文件尾。文件头包含FLV的标识符、版本...
总之,将RTMP流保存为MP4或FLV格式涉及的关键技术包括librtmp的流接收和FLV封装,ffmpeg的多格式转换,以及mp4v2的MP4文件处理。掌握这些技术,不仅可以帮助你处理实时流媒体,还能扩展到其他音视频处理项目。
VLC是开源软件,拥有跨平台的能力,可以处理多种不同的视频和音频格式,包括不常见的或不完全的编码格式。 5. 在线播放与开发:由于FLV格式与Flash Player的紧密关系,它在Web上的应用广泛,特别是在实时流媒体服务...
本文将深入探讨FFmpeg的整体流程、框架结构、主要数据结构及其在处理视频格式,如MP4和FLV时的关键分析。 1. FFmpeg整体流程: FFmpeg 的工作流程大致可以分为四个阶段:输入、解码、处理和编码。首先,FFmpeg 使用...
总之,FFmpegAndroidCameraEncoder是一个实用的项目,它结合了Android摄像头技术、FFmpeg编码能力和FLV封装,为开发者提供了一种在Android平台上实现实时视频编码的解决方案。深入研究该项目,有助于开发者在移动...
4. **视频转码**:将其他格式的视频转换为FLV格式,以适应不同的网络环境和设备。 5. **视频信息提取**:通过PHP解析FLV头部信息,获取视频的长度、分辨率、编码格式等元数据。 6. **视频播放器**:生成嵌入网页的...
FFmpeg是一个开源项目,它提供了一整套强大的音频和视频处理工具,包括解码、编码、转码、流媒体和过滤等功能。在这个“H264toRTMP源码”中,我们主要关注的是如何使用FFmpeg API来处理H264编码的数据,并将其封装成...
- 封装格式:MP4、MKV、FLV等,FFmpeg可以转换不同封装格式。 - 封装命令:`-f` 指定输出格式,如`ffmpeg -i input.mp4 -f flv rtmp://server/live/stream` 6. FFmpeg 流媒体: - RTMP、HLS、DASH等流媒体协议...
通过分析压缩包中的"FLVCode",开发者可以学习到如何处理FLV视频格式,包括编码和解码流程、如何处理音视频同步问题、如何实现FLV到其他格式的转换等。对于想要开发或优化流媒体服务的人来说,这些知识和技术是至关...
上述代码展示了FLV封装器的基本结构,包括短名称、长名称和MIME类型等基本信息。 通过上述分析,我们可以看到FFMpeg不仅提供了一个强大的多媒体处理平台,还以其高度模块化的设计为开发者提供了极大的灵活性和扩展...
2. VLC 功能特性:VLC 支持大量的音视频传输、封装和编码格式,如 MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC 等。它也支持多种访问形式,如文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP 组播、...
在本文中,我们将深入探讨如何使用FFmpeg将YUV格式的视频数据转换为H264编码,并将其封装到FLV容器中,所有操作都在内存中完成,无需依赖磁盘I/O。 首先,我们需要理解YUV和H264的基本概念。YUV是一种常见的视频...
ffmpeg 库是一款开源的多媒体处理库,提供了各种编解码器和封装格式的支持。 ffmpeg 库的架构 ffmpeg 库的架构可以分为四个区域:架构函数区域、协议处理函数区域、封装格式处理函数区域和编解码函数区域。 * ...
FFmpeg是一个功能非常强大的开源音视频处理工具库,它支持几乎所有的音视频格式,进行编解码、复用、解复用、转码、滤镜处理、文件封装和封装格式处理等操作。下面将详细介绍FFmpeg的核心概念和相关知识点。 **容器...
- libavformat:容器格式库,负责处理各种多媒体容器格式,如MP4、FLV、MKV等。 - libavfilter:滤镜库,提供了一系列的图像和音频处理滤镜,如裁剪、缩放、旋转、音效调整等。 - libavutil:通用工具库,包含...
- **libavformat**:处理多媒体容器格式,如MP4、FLV、AVI等,负责读取和写入文件的封装格式。 - **libavfilter**:提供了视频和音频过滤器,可以进行剪辑、缩放、色彩调整等操作。 - **libavutil**:包含通用的...
- 封装格式:编码后的数据会被封装成FLV(Flash Video)格式,这是RTMP协议支持的默认容器格式。 - 推流过程:Android应用通过调用RTMP库,连接到服务器,然后将封装好的FLV数据发送给服务器。 2. **x264编码**:...
4. **封装器(Muxers)**:封装器负责将编码后的数据打包成特定的文件格式,如 MP4、MKV、FLV 等。 5. **解封装器(Demuxers)**:解封装器则负责将这些打包好的文件解析为可被解码器处理的数据流。 6. **网络协议...
ffmpeg支持多种编码和解码标准,如MPEG、DivX、MPEG4、AC3、DV、FLV等,并且能处理多种文件格式,如AVI、MPEG、OGG、Matroska、ASF等。尽管ffmpeg具有完整的编码解码功能,但在TCPMP中,仅使用了其部分解码功能。...
你需要创建一个GraphBuilder对象来构建视频流的处理链路,包括源过滤器(用于读取FLV文件)、解码过滤器(将FLV数据转化为可播放的格式)和渲染过滤器(将视频显示到屏幕上)。 4. **加载和播放FLV文件**:使用...