当前位置: 首页 > article >正文

常见的音视频格式介绍

目录

    • aac格式介绍(ADTS)
    • h264格式分析
    • FLV和MP4格式介绍

aac格式介绍(ADTS)

aac的格式有两种:ADIF不常用,ADTS是主流,所以这里主要讲解ADTS。简单来说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的header,所以必须得到所有的数据后解码。参考下图
在这里插入图片描述

⼀个AAC原始数据块⻓度是可变的,对原始帧加上ADTS头进⾏ADTS的封装,就形成了ADTS帧。参考下图

adts-header的长度一般为7字节,当protection_absent=0时,表示需要校验码,此时的adts-header就会额外添加一个2字节的校验码,此时的adts-header长度就为9字节。

⼀般情况下ADTS的头信息都是7个字节,分为2部分:

  1. adts_fixed_header
  2. adts_variable_header

其中,adts_fixed_header为固定头信息,adts_variable_header是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间不同。 参考下图

注:ADTS Header的长度可能为7字节或9字节,当protection_absent字段为时,表示需要校验码,此时是9字节;否则为7字节。

常见的header字段如下:

  • 同步字(syncword):2个字节(16位) 同步字是ADTS文件的标志符,它用于确定音频帧的开始位置和结束位置,通常为0xFFF。
  • ID (MPEG Version):1个字节(8位) ID指示使用的MPEG版本。值为0表示MPEG-4,值为1表示MPEG-2。
  • Layer:2个比特 Layer定义了音频流所属的层级,对于AAC来说,其值为0。
  • Protection Absent:1个比特 Protection Absent指示是否启用CRC错误校验。当该比特为0时,表明音频数据经过CRC校验,否则未经过CRC校验。
  • Profile:2个比特 Profile指示编码所使用的AAC规范类型,如AAC LC、AAC HE-AAC等。
  • Sampling Frequency Index (Sampling Rate):4个比特 Sampling Frequency Index表示采样率的索引,它告诉解码器当前音频数据的采样率。这个值的范围是0到15,每个值表示一个特定的采样率。参考下图
    在这里插入图片描述
  • Private Bit:1个比特 Private Bit为私有比特,通常被设置为0,没有实际作用。
  • Channel Configuration:3个比特 Channel Configuration指示音频的通道数,如单声道、立体声或多声道等。
  • Originality:1个比特 Originality指示编码数据是否被原始产生,通常为0。
  • Home:1个比特 Home bit通常被设置为0,没有实际作用。
  • Emphasis:2个比特 Emphasis指示对信号进行强调处理的类型,一般不使用。
  • sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。

这里只是对aac格式的简单介绍,想要了解更多内容,参考:AAC-ADTS格式分析【转载】-CSDN博客

h264格式分析

H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

H264主要分为两层:编码层(Video Coding Layer,VCL)和网络抽象层(NetworkAbstraction Layer (NAL));前者定义了各种编码的算法,后者将前者编码的数据按照一定的方式进行打包存储或者传输。而NAL单元(NALU)作为可以单独可以解码的结构,整个H264的码流可以理解为由多个NALU组成的。这里我们主要介绍NALU。

先来认识一些相关概念

  • SPS:序列参数集,SPS中保存了⼀组编码视频序列的全局参数。
  • PPS:图像参数集,对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。
  • I帧:帧内编码帧,可独⽴解码⽣成完整的图⽚。
  • P帧: 前向预测编码帧,需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。
  • B帧: 双向预测内插编码帧,则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。
  • 在I帧之前,至少有一个SPS和PPS。
  • GOP:GOP是一组连续的视频帧,这些帧按照一定的编码规则被组织在一起。GOP的设计目的是为了提高视频数据的压缩效率,并且使得视频流能够支持随机访问。

H.264/AVC只是定义了一种标准,常见的具体格式有两种:AnnexB格式和AVCC格式。AnnexB格式主要用于实时播放(.h264文件就是这种格式),AVCC格式主要用于视频存储,即AnnexB是能够直接播放的,而AVCC不能直接播放。

AnnexB格式[start code]NALU | [start code] NALU | ...

SPS和PPS被嵌入到视频流中,其本身也是一种NALU。这种格式比较常见,也就是我们熟悉的每个帧前面都有0x00 00 00 01或者0x00 00 01作为起始码。

在这里插入图片描述

AVCC格式([extradata]) | ([length] NALU) | ([length] NALU) | ...

这里的NALU一般没有SPS PPS等参数信息,参数信息属于extradata位于文件的头部。比如ffmpeg中解析mp4文件后SPS PPS存在streams[index]->codecpar->extradata中。

在这里插入图片描述

AnnexB和AVCC的区别在于:

  1. NALU之间的分隔方式不同:AnnexB是通过在每一个NALU前面添加一个start code,而AVCC则是通过在NALU前都加上一个大端格式的前缀,表示NALU的长度。
    AnnexB格式的start code有两种:
       ①3字节 0x000001   单帧多[slice](即单帧多个NALU)之间间隔
       ②4字节 0x00000001  帧之间,或者SPS等之前
    而AVCC格式的长度前缀一般设置为4个字节。

  2. SPS和PPS的位置不同:AnnexB是将SPS和PPS直接嵌入到视频流中的,SPS和PPS也是一种NALU。即每一个GOP的起始位置都有一个SPS和PPS,所以解码器可以从AnnexB格式的视频流随机点开始进行解码。而AVCC格式格式是将视频的元数据和SPS和PPS等内容统一放到文件的头部,这部分内容通常称为extradata或者sequence header。所以AVCC格式主要用于视频存储,MP4、MKV通常用AVCC格式来存储。

这里主要介绍AnnexB格式和AVCC格式的区别,想要了解H264-NALU的结构,可以参考:H264基础简介【转载】-CSDN博客,这篇博客以AnnexB格式为例,介绍了h264的格式。

FLV和MP4格式介绍

  • FLV格式

FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后的第⼀个Pervious Tag Size的值为0。 参考下图

在这里插入图片描述

这里只是对flv格式的简单介绍,详情参考:FLV文件格式分析【转载】-CSDN博客

  • MP4格式

MP4协议本身没有多复杂,没啥特别难理解的地方,关键的“复杂”点就在于其“大”,嵌套的各种各样的子box。详情参考:整理mp4协议重点【转载】-CSDN博客


http://www.kler.cn/news/366673.html

相关文章:

  • shodan1,shodan简介和kali下的使用
  • 计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议
  • 《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法
  • AJAX—— jQuery 发送 AJAX 请求
  • 【问题解决】C++调用shared_from_this()报错bad_weak_ptr解决方案
  • 一、Hadoop:大数据处理之基石
  • Cilium + ebpf 系列文章- (七)Cilium-LoadBalancer类型的SVC的IPPool
  • 总裁主题CeoMax-Pro主题7.6开心版
  • 在linux系统中查看具体文件大小命令
  • 【C++习题】12.滑动窗口_将 x 减到 0 的最小操作数
  • 通过Docker Compose构建自己的Java项目
  • 【升华】另一个神经网络学习框架pytorch
  • 智能台灯设计(一)原理图设计
  • 大话网络协议:从OSI七层模型说开去
  • Git的原理和使用(六)
  • android 生成json 文件
  • row_number() over (partition by 分组列 order by 排序列 desc)、row_number() 函数、分组排序函数
  • 计算机网络(十二) —— 高级IO
  • 12_Linux进程管理命令详解
  • python如何通过json以及pickle读写保存数据
  • gin入门教程(9):路由分组与路由版本控制
  • MySQL 存储结构
  • 基于信号分解和多种深度学习结合的上证指数预测模型
  • 基于Multisim的音频放大电路设计与仿真
  • 软体机器人纤维:材料选择有讲究,热拉伸工艺来制造,多种功能应用
  • Spring Boot 配置文件(yml、properties | bootstrap、application)加载顺序