音视频知识小结

前言

小结的有些音视频相关的学问,文末计算有传送门。

概念

  • 协议层(Protocol
    Layer):该层处理的数码为契合一定流媒体协议正式的数额,例如http,rtmp,file等;
  • 封装层(Format
    Layer):该层处理的数量为契合一定封装格式规范的数目,例如mkv,mp5,flv,mpegts,avi等;
  • 编码层(Codec
    Layer):该层处理的数据为符合一定编码标准规范的数量,例如h264,h265,mpeg2,mpeg4等;
  • 像素层(Pixel
    Layer):该层处理的多寡为符合一定像素格式规范的数据,例如yuv420p,yuv422p,yuv444p,rgb24等;

此分类和图表源于雷公的博客,那里是链接

很多多媒体数据流需求同时涵盖音频数据和录像数据,那时日常会进入一些用来音频和摄像数据同步的元数据,例如字幕。这两种数据流可能会被差距的顺序,进程或者硬件处理,不过当它们传输或者存储的时候,那两种多少一般是被封装在一块的。平常这种封装是经过摄像文件格
式来完结的,例如常见的.mpg, .avi, .mov, .mp4, .rm, .ogg or .tta
那些格式中有些只可以动用一些编解码器,而越多可以以容器的形式利用各类编解码器。

视频压缩原理

1、压缩的样子

数字化后的摄像信号具有很大的数据冗余,压缩的真相就是去掉那一个冗余。

  • 空间冗余,摄像的背景和全部颜色相近并且平稳变化,可以采取帧内编码进行削减;(无损)
  • 岁月冗余,八个录像帧之间具有强相关性,利用举手投足推断移动补偿展开帧间压缩;(无损)
  • 社团冗余,图像内部存在相似性,通过那种关涉足以开展分形编码;
  • 编码冗余,出现几率大的颜料编码长度短,几率小的颜色编码长度长;(可变长度编码)
  • 视觉冗余,利用人眼对亮度和色度的敏感度差距,在编码时进行数据压缩;(有损压缩)

2、变换

空间域描述的图像相关性不太强烈,须要更换来频率域。常用的正交变换有离散傅里叶变换,离散余弦变换等等。数字视频压缩进度中动用广泛的是离散余弦变换。

  • 空间域(spatial domain),又称图像空间(image
    space)。由图像像元组成的半空中。在图像空间中以长度(距离)为自变量间接对像元值举办处理称为空间域处理。
  • 频率域(spatial frequency
    domain),以空间频率为自变量描述图像的表征,可以将一幅图像像元值在空间上的变化表明为保有不一样振幅、空间频率和相位的简振函数的线性叠加,图像中种种空间频率成分的咬合和遍布称为空中频谱。那种对图像的空间频率特征举办解释、处理和剖析称为频率域处理或波数域处理。

图像处理中的空间域就是像素域,在空间域的处理就是在像素级的拍卖,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱。表示图像的能量梯度。

借用雷王blog的三张图来论述效果:

一个实际8*8图像块

图像块经过DCT变换后的周到

量化后的DCT周密

H.264格式

H.264是音摄像知识中,必须深入摸底的片段。

先介绍部分着力的概念

  • I帧是关键帧,解码时只需求本帧数据;

  • P帧是参考帧,表示这一帧与前一个关键帧(或P帧)的歧异;

  • B帧是双向参考帧,表示本帧与上下帧的差距;(B帧压缩率高,解码复杂,直播中较少用)

  • IDR帧是率先个I帧,为的是和此外I帧差异开,方便控制编码和解码;

IDR会导致DPB(DecodedPictureBuffer 参考帧列表)清空,而I不会。

  • GOP(Group Of
    Picture)是图像组,是一组一连的镜头;(直播已毕秒开,关键就是CDN节点缓存GOP,编码器获得第二个GOP后当即解码播放)

  • 帧内压缩:当压缩一帧图像时,仅考虑本帧的多寡而不考虑相邻帧之间的冗余新闻;(帧内压缩一般达不到很高的缩减,跟编码jpeg大约)

  • 帧间精减:利用相邻帧的相关性提升压缩量,收缩冗余;(运动补偿和运动臆想是常用的技术)

编码顺序

简单描述下编码的进度,假如大家处理的率先帧是DIR帧:

  1. 编码IDR帧

  2. 根据scenecut 和 min-keyint的安装,向后移动 min-keyint的离开,起初判定是不是为scenechange,直到判定知足,或者到达keyint设置值的距离时候为止。同时记录判定条件不完全满意时候的职责。

  3. 编码找到的为指针,亦为IDR帧,GOP形成。

  4. 根据2步中取得的论断条件不完全满足的岗位,将对应帧按时间各样用I编码。

  5. 找到最头上IDR和离其多年来的I帧形成的Sub-GOP(严苛意义上说那里并非GOP因为GOP之间无法交流消息,)结合bframes的设定大小,估计P帧出现的职分。具体而言,按时间各种走每一帧相比该帧用P编码和B编码时的视觉误差和复杂度何者更大,依据一些公式推导出那里应该用何种帧类型,再向后移一帧;即使直到bframes规定的值都未出现P,则强制插入一帧P。这样就控制了各样sub-GOP内P帧的岗位。

  6. 终极一步,根据I/IDR/P形成的子区间,按时间各样编码各帧为B帧。

举例:100-120帧这么的一段视频
首先步截止后编码已毕 100帧
其次步停止后也许编码完毕 120帧和110帧 (IDR帧)同时找出了104,108,
115帧相应编码为I
第四步为止后编码已毕104 108 115 帧为I
第五步对 100-104 104- 108 108-110 110 – 115
115-120三个子区间,判断P帧出现的职位并编码有可能判断出102 113 118
为p帧
最后一步在编码之间的片段为B帧
于是解码进程的输出帧顺序其实是
100 110 104 108 102 101 103 105 106 109….

此例来自360文库,不过原文链接已经无法用,欢迎告知出处以备注。

iOS的H.264编解码

使用VideoToolbox硬编码H.264
使用VideoToolbox硬解码H.264

旋律压缩原理

数字音频压缩编码在确保信号在听觉方面不爆发失真的前提下,对旋律数据信号进行尽可能大的收缩。数字音频压缩编码选择去除声新闻号中冗余成分的主意来完成。所谓冗余成分指的是节奏中无法被人耳感知到的信号,它们对确定声音的音色,音调等新闻尚未别的的援救。
冗余信号包括人耳听觉范围外的旋律信号以及被隐形掉的音频信号等。
人耳听觉的隐藏效应:当一个强音讯号与一个弱新闻号同时设有时,弱音讯号将被强音信号所隐藏而听不见,那样弱新闻号就足以算得冗余信号而不用传送。

频谱掩蔽效应

一个效能的声息能量小于某个阈值之后,人耳就会听不到,那个阈值称为最小可闻阈。当有此外能量较大的鸣响出现的时候,该声音频率附近的阈值会进步广大,即所谓的隐身效应。

时域掩蔽效应

当强新闻号和弱消息号同时出现时,还设有时域掩蔽效应。即双方暴发时间很接近的时候,也会发出掩蔽效应。时域掩蔽进度曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三片段。

  • PCM是编码格式,经过话筒录音后直接得到的未经压缩的数据流;

多少大小=采样频率*采样位数*声道*秒数/8。
采样定理标志采样频率必须高于被采样信号带宽的两倍,其它一种同等的传教是奈奎斯特功用必须超出被采样信号的带宽。假使信号的带宽是
100Hz,那么为了防止混叠现象采样频率必须高于200Hz。换句话说就是采样频率必须至少是信号中最大频率分量频率的两倍,否则就无法从信号采样中还原原有信号。

  • AAC是编解码标准,基于MPEG-2的节奏编码技术;

使用AudioToolbox编码AAC
使用AudioToolbox播放AAC
PCM采样率是44100Hz,那么AAC码率可设置64000bps;
假要是16K,可安装为32000bps;

  • mp5是封装格式,所存放数据使用的编码格局称为MPEG1 Layer-3 ;

  • AMR是封装格式,专用于有效地压缩语音频率;

  • WAV是封装格式,里面可以存放七种编码格式的数码,一般是PCM数据;

零星的文化

FLV封装格式是由一个FLV
Header文件头和一个一个的Tag组成的。Tag中涵盖了旋律数据以及视频数据。FLV的结构如下图所示。

FLV(Flash
Video)是Adobe集团安排开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特性,使其很吻合在互连网上拓展应用。

RTSP:实时流传输协议,是TCP/IP协议连串中的一个应用层协议;

M4A:.m4a是MPEG-4 音频标准的公文的壮大名,Apple在iTunes以及
iPod中运用“.m4a”以分别MPEG4的视频和音频文件;

音摄像同步:时间戳,时间戳即为一帧的募集时间,音视频采用同一个参考时间,给各样帧打上时间戳。

rtmp发送音视频:xcode中编译librtmp库,遵从rtmp协议,将数据发送到指定服务器;

AudioToolbox.framework:提供Core奥迪o的中高级其他API服务,处理电话和其他高优先级语音处理而造成的间歇和死灰复燃操作等;

奥迪(Audi)oUnit.framework:提供DSP数字信号处理有关的插件,包蕴编解码,混音,音频均衡等;

AVFoundation.framework:提供一个简洁的音乐播放类,可以播放所有IOS援助的旋律;

OpenAL.framework:提供3D音效播放;

AVFoundation相关

AVAssetExportSession

AVAssetExportSession类可以把AVAsset对应的源文件,转换成预先安装的格式。
exportPresetsCompatibleWithAsset 可以导出可配备格式的列表;

Error相关

AVAssetWriter

AVAssetWriter常常报出荒谬

AVAssetWriter startSessionAtSourceTime: Cannot call method when status
is 0

翻开文档,知道status=0表示未知,可见应该是绝非初步化成功AVAssetWriter;

typedef NS_ENUM(NSInteger, AVAssetWriterStatus) {
    AVAssetWriterStatusUnknown = 0,
    AVAssetWriterStatusWriting,
    AVAssetWriterStatusCompleted,
    AVAssetWriterStatusFailed,
    AVAssetWriterStatusCancelled
};
EXC_BAD_ACCESS
mTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);

自我批评sampleBuffer是不是为空或者引用是或不是有retain;

expectsMediaDataInReal提姆e = YES导致视频断断续续

方今的解释是:
expectsMediaDataInRealTime=YES时索要interval=20ms左右的音频帧
sdk提供的节拍回调是50ms,expectsMediaDataInReal提姆e=YES的时候会招致音频断断续续(帧数不够);

证实:同样的写法expectsMediaDataInRealTime=YES,当音频帧的interval=20ms左右时,音频不卡。

总结

此篇小结并没有讲完自己在研发直播APP进度中,精晓的音视频知识。因为在事先的文集中,已经零碎介绍了一部分文化,不想再赘述。
自家也不是特意做音视频开发的,只是在研发进度中,遇到那么些知识,不懂的就查,作为文化储备。故而总计的内容,也有过多的一部分是出自于其余blog,比如说雷王。
想深切学习音视频开发,如故多到雷王的blog学习,那里是传送门。

相关文章