1 概述


2 解封装相关函数接口

avformat_alloc_context();负责申请一个AVFormatContext结构的内存,并进行简单初始化
avformat_free_context();释放该结构里的所有东西以及该结构本身
avformat_close_input();关闭解复用器。
avformat_open_input();打开输入视频文件
avformat_find_stream_info():获取视频文件信息
av_read_frame(); 读取音视频包
avformat_seek_file(); 定位文件
av_seek_frame():定位文件

3 解封装流程

如何区分不同的媒体类型,这里FFmpeg中采用AVMediaType定义。

enum AVMediaType {AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATAAVMEDIA_TYPE_VIDEO,AVMEDIA_TYPE_AUDIO,AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuousAVMEDIA_TYPE_SUBTITLE,AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparseAVMEDIA_TYPE_NB
};

4 解封装AAC音频

4.1 AAC简介

AAC⾳频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony和AT&T是主要的贡献者。
ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中间开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。
ADTS:全称是Audio Data Transport Stream。是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤到MPEG-4标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。在实时通信中主要使用ADTS格式进行数据传输。

4.2 AAC协议格式

ADTS格式的⾳频流。两者具体的组织结构如下所示:
• AAC的ADIF格式见下图:

• AAC的ADTS的⼀般格式见下图,空⽩处表示前后帧:

经验:开发过程中编码AAC裸流的时候,会遇到写出来的AAC⽂件并不能在PC和⼿机上播放,很⼤的可能就是AAC⽂件的每⼀帧⾥缺少了ADTS头信息⽂件的包装拼接。只需要加⼊头⽂件ADTS即可。⼀个AAC原始数据块⻓度是可变的,对原始帧加上ADTS头进⾏ADTS的封装,就形成了ADTS帧。

4.3 ADTS头解析

AAC⾳频⽂件的每⼀帧由ADTS Header和AAC Audio Data组成。结构体如图:

每⼀帧的ADTS的头文件都包含了音频的采样率,声道,帧长度等信息,这样解码器才能解析读取。
⼀般情况下ADTS的头信息都是7个字节,分为2部分:
adts_fixed_header();
adts_variable_header();
其⼀为固定头信息,紧接着是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间可变。

4.3.1 固定头协议信息


syncword :同步头 总是0xFFF, all bits must be 1,代表着⼀个ADTS帧的开始
ID:MPEG标识符,0标识MPEG-4,1标识MPEG-2
Layer:always: ‘00’
protection_absent:表示是否误码校验。Warning, set to 1 if there is noCRC and 0 if there is CRC
profile:表示使⽤哪个级别的AAC,如01 Low Complexity(LC)— AAC LC。有些芯⽚只⽀持AAC LC 。
在MPEG-2 AAC中定义了3种:

profile的值等于 Audio Object Type的值减1
profile = MPEG-4 Audio Object Type - 1

sampling_frequency_index:表示使⽤的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。
channel_configuration: 表示声道数,⽐如2表示⽴体声双声道

4.3.2 可变头协议信息


frame_length : ⼀个ADTS帧的⻓度包括ADTS头和AAC原始流.frame length, this value must include 7 or 9 bytes of header length:aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame)protection_absent=0时, header length=9bytesprotection_absent=1时, header length=7bytes
adts_buffer_fullness:0x7FF 说明是码率可变的码流。
number_of_raw_data_blocks_in_frame:表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有⼀个AAC数据块。

5 解封装H264视频

5.1 H264协议概述

H.264/AVC 标准于 2003 年首次发布。它建立在 MPEG-2 和 MPEG-4 Visual 等早期标准的概念之上,并提供了更好的压缩效率(即更好的压缩视频质量)和更大的灵活性的潜力用于压缩、传输和存储视频。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

5.2 H264编码原理

在音视频传输过程中,视频文件的传输是一个极大的问题;一段分辨率为19201080,每个像素点为RGB占用3个字节,帧率是25的视频,对于传输带宽的要求是:19201080325/1024/1024=148.315MB/s,换成bps则意味着视频每秒带宽为1186.523Mbps,这样的速率对于网络存储是不可接受的。因此视频压缩和编码技术应运而生。
对于视频文件来说,视频由单张图片帧所组成,比如每秒25帧,但是图片帧的像素块之间存在相似性,因此视频帧图像可以进行图像压缩;H264采用了16*16的分块大小对,视频帧图像进行相似比较和压缩编码。如下图所示:

5.3 帧类型

H264中的I帧、P帧和B帧
H264使⽤帧内压缩和帧间压缩的⽅式提⾼编码压缩率;H264采⽤了独特的I帧、P帧和B帧策略来实现,连续帧之间的压缩;

帧的分类 全称 意义
I帧 帧内编码帧 intra picture I 帧通常是每个 GOP(MPEG 所使⽤的⼀种视频压缩技术)的第⼀个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是⼀个图像经过压缩后的产物。⾃身可以通过视频解压算法解压成⼀张单独的完整的图⽚。
P帧 前向预测编码帧predictive-frame 通过充分将低于图像序列中前⾯已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。需要参考其前⾯的⼀个I frame 或者P frame来⽣成⼀张完整的图⽚。
B帧 双向预测帧 bi-directional interpolated prediction frame 既考虑与源图像序列前⾯已编码帧,也顾及源图像序列后⾯已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。

压缩率 B > P > I

5.4 H264编码结构解析

H264除了实现了对视频的压缩处理之外,为了⽅便⽹络传输,提供了对应的视频编码和分⽚策略;类似于⽹络数据封装成IP帧,在H264中将其称为组(GOP, group of pictures)、⽚(slice)、宏块(Macroblock)这些⼀起组成了H264的码流分层结构;H264将其组织成为序列(GOP)、图⽚(pictrue)、⽚(Slice)、宏块(Macroblock)、⼦块(subblock)五个层次。GOP (图像组)主要⽤作形容⼀个IDR帧 到下⼀个IDR帧之间的间隔了多少个帧。

5.5 IDR帧

⼀个序列的第⼀个图像叫做 IDR 图像Instantaneous Decoding Refresh(⽴即刷新图像),IDR 图像都是 I 帧图像。I和IDR帧都使⽤帧内预测。I帧不⽤参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样。⽐如(解码的顺序):
IDR1 P4 B2 B3 P7 B5 B6 I10 B8 B9 P13 B11 B12 P16 B14 B15 这⾥的B8可以跨过I10去参考P7
原始图像: IDR1 B2 B3 P4 B5 B6 P7 B8 B9 I10
IDR1 P4 B2 B3 P7 B5 B6 IDR8 P11 B9 B10 P14 B11 B12 这⾥的B9就只能参照IDR8和P11,不可以参考IDR8前⾯的帧
其核⼼作⽤是,是为了解码的重同步,当解码器解码到 IDR 图像时,⽴即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始⼀个新的序列。这样,如果前⼀个序列出现重⼤错误,在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤IDR之前的图像的数据来解码。



5.6 NALU结构



5.7 NALU头部解析

类型 全称 中文说明
F(1bit) 禁⽌位forbidden_zero_bit H.264 规范中规定了这⼀位必须为 0
R(2bit) 重要性指示位 bit nal_ref_idc 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它⽽不影响图像的回放,0~3,取值越⼤,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的⽚,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需⼤于0。
T(5bit) 负荷数据类型 nal_unit_type 这个NALU单元的类型,1~12由H.264使⽤,24~31由H.264以外的应⽤使⽤

NALU荷载类型:参考文档 H.264 : Advanced video coding for generic audiovisual services
• 5 IDR图像的编码条带
• 6 辅助增强信息 (SEI)
• 7 序列参数集(SPS)
• 8 图像参数集(PPS)

ffmpeg解封、解码实战相关推荐

  1. ffmpeg解封装及解码实战

    ffmpeg解封装及解码实战 目录 封装格式相关函数 解封装流程 补充 分离AAC和H264 1. 封装格式相关函数 1. 基本概念 2. 相关函数 1. avformat_alloc_context ...

  2. 深入浅出:FFmpeg 音频解码与处理AVFrame全解析

    深入浅出:FFmpeg 音频解码与处理全解析 一.FFmpeg 简介 1.1 FFmpeg 的历史与发展 1.2 FFmpeg 的主要组成部分 二.音频编解码基础 (Basics of Audio E ...

  3. 264编码基本概念 FFMpeg的解码流程

    下面转自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8楼 1.NAL.Slice与fr ...

  4. ffmpeg 硬解码

    ffmpeg 硬件解码 由于现在h264,h265视频的增多,分辨率增大,甚至2k,4k监控视频的增多,需要利用硬件来实现高效解码和AI识别等的情况越来越多,日益重要,显卡GPU的算力强大,可以提供更 ...

  5. ffmpeg中音频解码方法(附代码)+ffmpeg音频解码播放速度快的问题(随手笔记,以供查阅)

    最近在做一款取名为变速不变调播放器的时候,解码音频遇到了些问题(ffmpeg音频解码播放速度快的问题),网络上的方法对绝大多数的音视频文件有效,但是对于某些音频会有问题,比如某些ADPCM编码的WAV ...

  6. ffmpeg 音频解码一

    1. ffmpeg 视频解码一 2. ffmpeg 视频解码二 3. ffmpeg 音频解码一 4. ffmpeg 音频解码二 5. ffmpeg 音视频解码 6. ffmpeg 视频编码一 7. f ...

  7. ffmpeg 音频解码二

    1. ffmpeg 视频解码一 2. ffmpeg 视频解码二 3. ffmpeg 音频解码一 4. ffmpeg 音频解码二 5. ffmpeg 音视频解码 6. ffmpeg 视频编码一 7. f ...

  8. FFMPEG音频解码浅析

    结合各种资料和自己的理解,估计有些浅显. FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开文件: av_open_input_file() ...

  9. ffmpeg硬解码与软解码的压测对比

    文章目录 ffmpeg硬解码与软解码的压测 一.基本知识 二.压测实验 1. 实验条件及工具说明 2. 压测脚本 3. 实验数据结果 ffmpeg硬解码与软解码的压测 一.基本知识 本文基于intel ...

  10. FFmpeg音频解码流程详解及简单demo参考

    本文主要讲解FFmpeg的音频解码具体流程,API使用.最后再以一个非常简单的demo演示将一个mp3格式的音频文件解码为原始数据pcm文件. 本文主要基于FFmpeg音频解码新接口. 一.FFmpe ...

最新文章

  1. Scrum敏捷研发管理平台-Leangoo看板
  2. 3、Power Map—入门之楼盘分布图
  3. mysql 查数据 default无效_导入mysql数据的时候提示Field * doesn't have a default value解决方法...
  4. resolveType - when is date type for DateFormat used when initialization
  5. LINUX 对引导加密
  6. DM3730 LCD控制器驱动框架
  7. javascript实现代码高亮
  8. python gzip模块实现文件压缩的方法
  9. 百度图像识别明星或动物
  10. Python爬取《你好李焕英》猫眼实时票房
  11. 散列表,(拉链法,平方探测法,线性探测法)
  12. 中小学计算机教学大纲,中小学信息技术教材教法教学大纲.doc
  13. kali破解WiFi时wlan0没有变wlan0mon_黑客是如何破解WI-FI密码的?黑客破解了WI-FI之后能做什么?
  14. OpenCL-学习教程(一)
  15. 102道java算法
  16. LaTeX入门学习9(tikz基础-01)
  17. 程序员如何用技术变现?(取其精华去其糟粕)
  18. 莫烦python pytorch_[莫烦 PyTorch 系列教程] 1.2 – 安装 PyTorch
  19. vue中使用高德地图POI
  20. Android自动化框架对比

热门文章

  1. AcPlPlotEngine::beginGenerateGraphics() 返回Acad::eGraphicsNotGenerated的错误
  2. Android安全输入设计与思考
  3. python 正则 匹配任意字符串_Python正则表达式匹配字符串中的任意纯数字
  4. mysql中去重 distinct 用法
  5. Matlab中prod函数
  6. HTML之2022新年快乐虎年大吉给对象的不一样礼物
  7. 马斯克又要逆天!飞船回收24小时内只加燃油再次上天
  8. Hadoop架构及各组件介绍
  9. 2023年一级造价师教材
  10. WebApp 开发框架推荐以及优缺点分析