AVFoundation --- 01入门
AVFoundation --- 01入门
目标
解析框架,了解相关的功能和特性。媒体相关知识
解析AVFoundation
一 AVFoundation在整个体系中所处的角色! 1c08ff3e7f46e8099fa41eaa013f287b05245be151de2b8794126d4f11ba81ae.png
二 主要的支撑框架以及提供的功能
-
Core Audio
- 是OS X 和iOS系统上处理所有音频事件的框架
- 高层级接口(Audio Queue Services)处理基本的音频播放和录音相关功能
- 低层级接口(Audio Units)构建一些复杂的音频处理模式
-
Core Video
- 是OS X 和iOS系统上针对数据视频所提供的管道模式
- 为相对的Core Media提供图片缓存和缓存池支持,提供了对数字视频逐帧访问的接口
- 简化通过像素格式之间的转换并管理视频同步事项
-
Core Media
- 是AVFoundation所用到的低层级媒体管道的一部分
- 提供针对音频样本和视频帧处理所需的低层级数据类型和接口
- 提供了AVFoundation用到的记忆CMTime数据类型的时基模型
-
Core Animation
- 分装了支持OpenGL 和 OpenGL ES功能的基于Obc
三 解析AVFoundation
-
音频播放和记录
- AVAudioPlayer和AVAudioRecoder提供更加简单的整合音频播放和记录的功能,单这不是AVFoundation用于这些功能的唯一方式
-
媒体文件检查
- 可以查看媒体资源来确定是否适合特定任务,如是否用于回放、编辑和导出。还可以获取该媒体资源相关的技术参数(内容持续时间、创建日期、首选播放音量等)。基于AVMedateDataItem类提供元数据支持(允许读写媒体资源的描述信息)
-
视频播放
- 是AVFoundation提供的一个常用功能,可以从本地文件或远程流中获取的视频资源,并对播放和内容展示进行控制。核心类是AVPlayer和AVPlayerItem
-
媒体捕捉
- 摄像头捕捉核心类是AVCaptureSession,其作为所有活动的汇集点来接手摄像头设备由各路流发过来的电影和图片
-
媒体编辑
- 允许创建可以将多个音频和视频资源进行组合的应用长须,允许修改和编辑独立的媒体片段、随时修改音频文件的参数以及添加动画标题和场景切换
-
媒体处理
- 使用AVAssetReader和AVAssetWriter类来直接访问视频帧和音频样本。
数字媒体
将模拟信号转换成能够存储并传输的数字信号,要进过模拟-数字转换过程,这个过程成为采样(Sampling)
音频采样
- 采样率:音频数字化的过程包含一个编码方法,称之为线性脉冲编码调制(Linear PCM / LPCM),这个过程采样或测量一个固定的音频信号,过程的周期称之为采样率
- 尼奎斯特评率(Nyquist rate):该评率是需要采样对象的最高评率的2倍。不断提供采样率的频率,就有可能以数字化方式精准表现原始信号的信息。
- 位元深度:振幅在线性坐标系中进行测量,所以会有linear PCM这个术语。用于保存样本值的字节数定义了在线性维度上的可行的离散度,同时这个信息也被成为音频的位元深度。为每个样本的整体量化分配过少的位结果信息会导致数字音频信号产生的噪声和扭曲。使用位元深度为8的方法可以提供256个离散级别的数据,基本足够。
数据媒体采样
- 时间采样:捕捉一个信号周期内的变化
- 空间采样:对一幅图片在一定分辨率之下捕捉其亮度和色度,进而创建由该图片的像素点数据所构成的数字化结果(一般用在图片数字化和其他可视化媒体内容数字化的过程中)
数字媒体压缩
色彩二次抽样
-
YUV使用色彩通道UV替换了像素的亮度通道Y
-
人眼对亮度的敏感要高于颜色,可以大幅减少存储在每个像素中的颜色信息,而不至于图片的质量严重受损,这个减少颜色数据的过程称之为色彩二次抽样。
-
色彩二次抽样参数:4:4:4、 4:2:2、 4:2:0。根据这些值按J:a:b格式将亮度比例标识为色度值
- J:几个关联色块(一般4个)中所包含的像素数
- a:用来保存位于第一行中的每个J像素的色度像素个数
- b:用来保存位于第二行中的每个J像素的附加像素个数
编解码器压缩
- 大部分音频和视频都是使用编解码器来压缩,使用高级压缩算法对需要保存或发送的音视频数据进行压缩和编码,同时还可以将压缩文件解码成适合播放和编辑的媒体资源文件
视频编解码器
-
H.264
-
H.264规范是MPEG-4的一部分,遵循早期的MEPG-1和MPEG-2标准。
-
H.264与其他形式的MPEG压缩一样,通过以下两个维度缩小了视频文件的尺寸:
- 空间:压缩独立视频帧,被称为帧内压缩
- 时间:通过一组为单位的视频帧压缩多余数据,这一过程成为帧间压缩
-
帧内压缩:通过消除包含在每个独立视频帧内的色彩及结构中的多余信息来进行压缩,因此可以在不降低图片质量的情况下尽可能缩小尺寸。这类压缩同JEPG压缩的原理类似。帧内压缩也作为有损压缩,但通常用于对原始图片的一部分进行处理以生成极高质量的照片.
-
GOP: 在帧间压缩中,很多帧被组合在一起作为一组图片(GOP),对于GOP所存在的时间维度的多余可以被消除。比如行驶的汽车,场景的背景环境通常固定,固定的背景环境就代表了一个时间维度的多余,这个多余就可以通过压缩的方式消除
- I-Frames:这些帧都是一些单独的帧或关键帧,包含创建完整图片需要的所有数据。每个GOP正好有一个I-Frames。由于它是一个独立帧,其尺寸是最大的,但也是解压最快的。
- P-Frames:预测帧,是从基于最近的I-Frames或P-Frames的可预测的图片进行编码得到的。P-Frames可以引用最近的预测P-Frames或一组I-Frames。你将会经常看到这些被称为“reference frames”的帧。临近的P-Frames和B-Frames都可以对其进行引用
- B-Frames:双向帧,是基于使用之前和之后的帧信息进行编码后得到的帧。几乎不需要存储空间,但其解压过程会耗费较长的时间,因为它依赖于周围其他的帧
-
H.264还支持编码视图,用于确定在整个编码过程中所使用的的算法。
- Baseline:通常用于对移动端设备的媒体内容处理,提供了最低效的压缩,压缩后的文件任较大,但是它是最少计算强度的方法,因为它不支持B-Frames.
- Main:计算强度比Baseline高,可以达到比较高的压缩率
- High:计算复杂度最高,会得到最高质量的压缩效果
-
-
Apple ProRes
- 被认为是一个中间件或中间层编解码器,为专业编辑和生产工作流服务。
- 独立于帧,意味着I-Frames可以被使用,更适用于内容编辑上
- 使用可变比特率编码的方式来对复杂场景中的每一帧进行编码
- ProRes是有损编解码器,具有较高的编码质量。ProRes 422使用4:2:2的色彩二次抽样和10位采样深度,ProRes 444使用4:4:4色彩二抽样,具有最终4个用于表示支持无损alpha通道和高达12位的采样深度
- 只在OS X 上可用
音频编码解码器
-
AVFoundation支持大量不同格式的资源,然而在不用线性PCM音频情况下,更多的只能使用AAC
-
AAC
- AAC是H.264标准相应的音频处理方式
文本到语音
-
AVSpeedSynthesizer:用于执行具体的“文本到语音”会话,对于一个或多个AVSpeedUtterance实例,该对象起到了队列的作用,提供了接口控制和监视正在进行的语音播放
-
AVSpeedUtterance
- voice:支持的语言
- rate:播放速度,使播放率介于AVSpeedUtteranceMinimumSpeedRate和AVSpeedUtteranceMaximumSpeedRate之间,这两个值分别为0.0和1.0
- pitchMultiplier:音调,允许值一般介于0.5(低音调)和2.0(高音调)之间
- postutteranceDelay:指定播放下一句之间的短时间暂停
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:string];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
utterance.rate = 0.5;
utterance.pitchMultiplier = 1.0;
utterance.volume = 0.5;
utterance.postUtteranceDelay = 0.5;
utterance.preUtteranceDelay = 0.5;
代理监听
方法名称很容易理解,就不做介绍了
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didStartSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
- (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer willSpeakRangeOfSpeechString:(NSRange)characterRange utterance:(AVSpeechUtterance *)utterance API_AVAILABLE(ios(7.0), watchos(1.0), tvos(7.0), macos(10.14)){
}
注意点
AVSpeechSynthesisVoice 类提供API来获取锁支持的语言。设置语言时做下容错处理
[AVSpeechSynthesisVoice speechVoices];