常见音视频格式简单分析

AAC ADTS 格式分析

音频格式(Advanced Audio Coding)
ADTSAAC音频的传输流格式,这种格式的特征是它是一个有同步字的比特流,
解码可以在这个流中任何地方开始。
ADTS的头信息就是能支持任意帧解码的关键。
请添加图片描述

`ADTS`的头信息都包含了每一帧的音频采样率、声道、帧长度等关键信息,从而让解码器能够解析读取。

如上图所示,ADTS的头信息分两部分:

  • adts_fixed_header();//固定的头部信息
  • adts_variable_header();//可变的头部信息
    在这里插入图片描述

固定头信息的细节(部分)分析:

  1. syncword,同步头总是0xFFF代表着ADTS帧的开始:
  2. ID,MPEG标识符,0标识MPEG-4,1标识MPEG-2;
  3. Layer,通常都是’00’;
  4. protection_absent,表示是否误码校验;
  5. profile,表示使用哪个级别的AAC;
  6. sampling_frequency_index,表示使用的采样率下标;
  7. channel_configuration,表示声道数

在这里插入图片描述

可变头信息的细节(部分)分析:

  1. aac_frame_length,一个ADTS帧的长度(包括ADTS头和AAC原始流),通过是否存在误码校验来判断长度是7还是9个字节:
  2. adts_buffer_fullness,值为0x7FF则表示可变码率的码流;
  3. number_of_raw_data_blocks_in_frame,表示ADTS帧中有 number_of_raw_data_blocks_in_frame + 1个AAC原始帧。

MP3 格式分析

MPEG Audio Layer 3音频压缩包,文件大体上可分为三个部分:

  • ID3V2位于MP3文件头部,记录了作者,作曲,专辑等信息,拓展了ID3V1的信息量,长度可变,是由:
    • 标签头(一个):长度为10个字节;
    • 标签帧(若干):都有10个字节的帧头和至少1个字节的内容构成
  • 音频数据,具体细节分布如下:
    • 帧头:占4字节,记录同步信息,版本,层,CRC校验等信息;
    • CRC:一般为2字节
    • 通道信息(Side info):
  • ID3V1一般将文件末尾最后的128字节来存放ID3信息.

下面以<天地孤影任我行.mp3>为例:
在这里插入图片描述
在这里插入图片描述

拓展学习:
Mp3 文件结构全解析 (一)这个链接里面还有多个拓展链接参考
Mp3 文件结构全解析 (二)


H264 NALU分析

在这里插入图片描述

NALU的组成结构:

  • SPS,序列参数集;
  • PPS, 图像参数集;
  • I Frame 帧内编码帧;
  • P Frame 前向预测编码帧;
  • B Frame 双向预测编码帧

NALU的功能分为两层,VCLNAL

  • VCL视频编码层,包括核心压缩引擎和块,宏块和片的语法级别定义。
  • NAL网络提取层,负责将视频编码层产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

一个NALU = 一组对应于视频编码的NALU头信息 + 一个RBSP(Raw Byte Sequence Payload)
在这里插入图片描述

再细分NALU头信息:
在这里插入图片描述

  • T: 表示负荷数据类型,如图所示占5 bit
  • R: 重要性指示位,占2 bit
  • F: 禁止位,占1 bit

AVBitStreamFilter

typedef struct AVBitStreamFilter {
    const char *name;

    /**
     * A list of codec ids supported by the filter, terminated by
     * AV_CODEC_ID_NONE.
     * May be NULL, in that case the bitstream filter works with any codec id.
     */
    const enum AVCodecID *codec_ids;

    /**
     * A class for the private data, used to declare bitstream filter private
     * AVOptions. This field is NULL for bitstream filters that do not declare
     * any options.
     *
     * If this field is non-NULL, the first member of the filter private data
     * must be a pointer to AVClass, which will be set by libavcodec generic
     * code to this class.
     */
    const AVClass *priv_class;

    /*****************************************************************
     * No fields below this line are part of the public API. They
     * may not be used outside of libavcodec and can be changed and
     * removed at will.
     * New public fields should be added right above.
     *****************************************************************
     */

    int priv_data_size;
    int (*init)(AVBSFContext *ctx);
    int (*filter)(AVBSFContext *ctx, AVPacket *pkt);
    void (*close)(AVBSFContext *ctx);
    void (*flush)(AVBSFContext *ctx);
}

拓展学习:
H264编解码框图


FLV 格式

是由一个文件头文件体组成的格式:

  • 文件体(file Body)又是由一对对的Previous Tag Size字段 + tag组成.
  • 文件头(file Header)之后的第一个Previous Tag Size字段的值为0.
  • Previous Tag Size字段在tag之前,占用4个字节.它记录了前一个tag的大小,用来逆向读取处理.
  • tag一般分为三种类型,脚本(帧)数据类型,音频数据类型,视频数据类型.
    在这里插入图片描述

tag它们的头部tag Header结构都一样(参照上图),但类型不同,自然数据区域就不一样了:

  • MateData Tag的数据区域结构主要用来描述视频或音频信息的数据,比如采样,声道,频率等信息;
    • 第一个AMF包,一般为三个字节:
      • 第1个字节总是0x22,表示字符串;
      • 第2~3个字节用来标识字符串的长度,一般总是0x000A;
      • 最后就是字符串的内容了,一般总是onMetaData(6F,6E,4D,65,74,61,44,61,74,61).
    • 第二个AMF
      • 第1个字节表示AMF包的类型,一般总是0x08,表示数组;
      • 第2~5个字节表示数组元素的个数;
      • 最后即为个数组元素的封装了,数组元素是由元素名称和值组成的对(记录时长,视频宽度,高度等信息).
  • Video Tag Data
    • 第1个字节包含视频数据的参数信息,标识了帧类型(4 bit),编码ID(4 bit);
    • 第2个字节开始为视频流数据(8*n bit).
  • Audio Tag Data
    • 第1个字节包含了音频数据的参数信息,标识了音频格式(4 bit),采样率(2 bit),采样精度(1 bit),音频声道(1 bit);
    • 第2个字节开始为音频流数据(8*n bit).

猜你喜欢

转载自blog.csdn.net/Stephen8848/article/details/125232659