zoukankan      html  css  js  c++  java
  • 封装格式---FLV---文件格式解析

    转自:https://wuyuans.com/2012/08/flv-format

     flv文件主要由两部分组成:header和body。

    1.header

    header部分记录了flv的类型、版本等信息,是flv的开头,一般都差不多,占9bytes。具体格式如下:

    文件类型 3 bytes “FLV”
    版本 1 byte 一般为0x01
    流信息 1 byte 倒数第一位是1表示有视频倒数第三位是1表示有音频,倒数第二、四位必须为0
    header长度 4 bytes 整个header的长度,一般为9;大于9表示下面还有扩展信息

    2.body

    每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。

    body部分由一个个Tag组成,每个Tag的下面有一块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系如下图:flv

    2.1.Tag

    每个Tag由也是由两部分组成的:Tag Header和Tag Data。Tag Header里存放的是当前Tag的类型、数据区(Tag Data)长度等信息,具体如下:

    名称长度介绍
    Tag类型 1 bytes 8:音频
    9:视频
    18:脚本
    其他:保留
    数据区长度 3 bytes 在数据区的长度
    时间戳 3 bytes 整数,单位是毫秒。对于脚本型的tag总是0
    时间戳扩展 1 bytes 将时间戳扩展为4bytes,代表高8位。很少用到
    StreamsID 3 bytes 总是0
    数据区(data) 由数据区长度决定 数据实体

    2.2.Tag Data

    数据区根据Tag类型的不同可分为三种,音频数据、视频数据和脚本数据。

    2.2.1.音频数据

    第一个byte是音频的信息,格式如下。

    名称长度介绍
    音频格式 4 bits 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 bits 0 = 5.5-kHz
    1 = 11-kHz
    2 = 22-kHz
    3 = 44-kHz
    对于AAC总是3
    采样的长度 1 bit 0 = snd8Bit
    1 = snd16Bit
    压缩过的音频都是16bit
    音频类型 1 bit 0 = sndMono
    1 = sndStereo
    对于AAC总是1

    第2byte开始就是音频流数据了。

    2.2.2.视频数据

    和音频数据一样,第一个byte是视频信息,格式如下:

    名称长度介绍
    帧类型 4 bits 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
    编码ID 4 bits 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

    2.2.3脚本数据

    该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。结构如图所示:

    这里写图片描述

    第一个AMF包:

    第1个字节表示AMF包类型,常见的数据类型如下:

    FLV文件中,第一个字节一般总是0x02,表示字符串。第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

    第二个AMF包:

    第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如下表: 
    这里写图片描述

    3.总结

    flv的格式还是比较简单的,header部分很简洁,body部分都是由一个个tag,tag的话也就三种,脚本tag一般只有一个的,我想这也是flv能成为在线视频格式的原因吧。

  • 相关阅读:
    python的metaclass
    鱼和水的故事
    iOS的QuickTime Plugin
    二进制/十六进制转浮点数的编程(互转类似)
    Android开发常见错误及技巧
    Mac 热键大全
    Java动态程序设计:反射介绍
    注册asp.net 4.0 到iis
    javascript常用判断写法
    将存储过程执行的结果保存到临时表
  • 原文地址:https://www.cnblogs.com/qing1991/p/10146516.html
Copyright © 2011-2022 走看看