数字化后的视频信号具有很大的数据冗余,压缩的本质就是去掉这些冗余。
空间域描述的图像相关性不太明显,需要变换到频率域。常用的正交变换有离散傅里叶变换,离散余弦变换等等。数字视频压缩过程中应用广泛的是离散余弦变换。
图像处理中的空间域就是像素域,在空间域的处理就是在像素级的处理,如在像素级的图像叠加。通过傅立叶变换后,得到的是图像的频谱。表示图像的能量梯度。
借用雷神blog的三张图来阐述效果:
H.264是音视频知识中,必须深入了解的部分。
先介绍一些基本的概念
I帧是关键帧,解码时只需要本帧数据;
P帧是参考帧,表示这一帧与前一个关键帧(或P帧)的差别;
B帧是双向参考帧,表示本帧与前后帧的差别;(B帧压缩率高,解码复杂,直播中较少用)
IDR帧是第一个I帧,为的是和其他I帧区别开,方便控制编码和解码;
IDR会导致DPB(DecodedPictureBuffer 参考帧列表)清空,而I不会。
GOP(Group Of Picture)是图像组,是一组连续的画面;(直播实现秒开,关键就是CDN节点缓存GOP,编码器拿到第一个GOP后马上解码播放)
帧内压缩:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息;(帧内压缩一般达不到很高的压缩,跟编码jpeg差不多)
简单描述下编码的过程,假设我们处理的第一帧是DIR帧:
举例: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文库,但是原文链接已经不能用,欢迎告知出处以备注。
使用VideoToolbox硬编码H.264
使用VideoToolbox硬解码H.264
数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。
冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。
人耳听觉的掩蔽效应:当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送。
一个频率的声音能量小于某个阈值之后,人耳就会听不到,这个阈值称为最小可闻阈。当有另外能量较大的声音出现的时候,该声音频率附近的阈值会提高很多,即所谓的掩蔽效应。
当强音信号和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线如图所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。
PCM是编码格式,经过话筒录音后直接得到的未经压缩的数据流;
数据大小=采样频率*采样位数*声道*秒数/8。
采样定理表明采样频率必须大于被采样信号带宽的两倍,另外一种等同的说法是奈奎斯特频率必须大于被采样信号的带宽。如果信号的带宽是 100Hz,那么为了避免混叠现象采样频率必须大于200Hz。换句话说就是采样频率必须至少是信号中最大频率分量频率的两倍,否则就不能从信号采样中恢复原始信号。
AAC是编解码标准,基于MPEG-2的音频编码技术;
使用AudioToolbox编码AAC
使用AudioToolbox播放AAC
PCM采样率是44100Hz,那么AAC码率可设置64000bps;
如果是16K,可设置为32000bps;
MP3是封装格式,所存放数据使用的编码方式称为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:提供CoreAudio的中高级别的API服务,处理电话和其他高优先级语音处理而导致的中断和恢复操作等;
AudioUnit.framework:提供DSP数字信号处理相关的插件,包括编解码,混音,音频均衡等;
AVFoundation.framework:提供一个精简的音乐播放类,可以播放所有IOS支持的音频;
OpenAL.framework:提供3D音效播放;
AVAssetExportSession类可以把AVAsset对应的源文件,转换成预先设置的格式。
exportPresetsCompatibleWithAsset 可以导出可配置格式的列表;
AVAssetWriter经常报出错误
AVAssetWriter startSessionAtSourceTime: Cannot call method when status is 0
查看文档,知道status=0表示未知,可知应该是没有初始化成功AVAssetWriter;
typedef NS_ENUM(NSInteger, AVAssetWriterStatus) {
AVAssetWriterStatusUnknown = 0,
AVAssetWriterStatusWriting,
AVAssetWriterStatusCompleted,
AVAssetWriterStatusFailed,
AVAssetWriterStatusCancelled
};
mTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
检查sampleBuffer是否为空或者引用是否有retain;
目前的解释是:expectsMediaDataInRealTime=YES
时需要interval=20ms左右的音频帧
sdk提供的音频回调是50ms,expectsMediaDataInRealTime=YES的时候会导致音频断断续续(帧数不够);
验证:同样的写法
expectsMediaDataInRealTime=YES
,当音频帧的interval=20ms左右时,音频不卡。
出处:大神http://www.jianshu.com/p/162a5821525c