AVFoundation(一)概览
AVFoundation(二)音频播放与录制
1.AVFoundation使用范围:

Core Audio:音频框架
Core Vedio:视频框架
Core Media:媒体框架
Core Animation:动画框架
2.AVFoundation解析
2.1 音频播放与记录
主要类:AVAudiPlayer、AVAudioRecorder
2.2 媒体文件检查
主要类:AVMetadataItem
2.3 视频播放
主要类:AVPlayer、AVPlayerItem
2.4 媒体捕捉
主要类:AVCaptionSession
2.5 媒体编辑
主要类:AVComposition(组合)、AVAudioMix(混合音频)
2.6 媒体处理
主要类:AVAssetReader、AVAssetWriter
3. 数字媒体
3.1 数字媒体采样
媒体内容数字化有两种方式:
- 时间采样:捕捉一个信号周期内的变化
- 空间采样:对一副图片(一帧)在一定分辨率下捕捉其亮度和色度,进而创建由该图片的像素点数据所构成的数字化结果
3.2 音频采样介绍
振幅:表示了电压的强度或相应信号的强度
频率:单位是Hz,表示在一个周期内完成循环的次数
LPCM:(linear pulse-code modulation),音频数字化的一个编码方法,称为线性脉冲编码调制。
采样率:采样或测量一个固定的音频信号,这个过程的周期率成为采样率
视频帧率:视频由一系列成为“帧”的图片组成,视频文件一秒钟内所能展现的帧数成为视频的帧率,并用FPS作为单位进行测量。常见的帧率有24FPS、25FPS、30FPS
3.3 数字媒体压缩

为了缩小数字媒体文件大小,我们需要对其进行压缩
3.3.1 色彩二次抽样
视频数据是使用YCbCr颜色模式的典型案例,YCbCr也常称为YUV,Y为亮度,UV表示色度(颜色)。
图片的所有细节都保存在亮度通道中,由于人类眼睛对亮度的敏感度要高于颜色,所以我们可以大幅减少存储在每个像素中的颜色信息,而不至于图片的质量严重受损,这个减少颜色数据的过程就称为色彩二次抽样。
平时看到摄像头规范和其他视频设备中提到的4:4:4、4:2:2及4:2:0,这些值就是设备所使用的色彩二次抽样的参数。根据这些值按如下格式将亮度比例表示为色度值,这个格式写作J:a:b,具体含义如下:
- J:几个关联色块(一般是4个)中所包含的像素数
- a:用来保存位于第一行中的每个J像素的色度像素个数
- b:用来保存位于第二行中的每个J像素的附加像素个数

在所有格式下,每个像素的全部亮度信息都被保存下来,4:4:4下全彩色信息也都被保存下来;在4:2:2的情况下,色彩信息为每两个水平像素的平均值,即亮度和色度比率为2:1;在4:2:0的情况下,色彩信息为水平和垂直两个方向的4个像素的平均值,结果就是亮度和色度的比率为4:1
3.3.2 编解码器压缩
大部分音频和视频都是使用编解码器(codec)来压缩的,编解码器是由编码器/解码器简写得来(encoder/decoder)。
无损压缩常用的为zip和gzip
有损压缩是使用psycho-acoustic或psycho-visual模式作为一种方法来减少媒体内容中的冗余数据
3.3.3 视频编解码器(重要)
AVFoundation提供有限的编解码器集合,只提供苹果认定的主流的集中媒体类型的支持。具体对于视频文件来说,主要归结为H.264和Apple ProRes
-
H.264
只要是H.264标准的文件,AVFoundation都提供视频编解码器支持,而且,行业内也默认对该编解码器进行了整合。这个标准广泛用于视频摄像头捕捉到的资源并成为网页流媒体视频所使用的最主要格式。H.264规范是MPEG所定义的MPEG-4的一部分。
H.264与其他形式的MPEG压缩一样,通过以下两个维度缩小了视频文件的尺寸:
- 空间:压缩独立视频帧,称为帧内压缩
- 时间:通过以组为单位的视频帧压缩冗余数据,这一过程称为帧间压缩
帧内压缩:通过消除包含在每个独立视频帧内的色彩及结构中的冗余信息来进行压缩,因此可在不降低图片指令的情况下尽可能缩小尺寸。这类压缩同JPEG压缩的原理类似,通过这一过程创建的帧成为I-frames.
帧间压缩:很多帧被组合在一起作为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以消除。

- I-frames:这些帧都是一些单独的帧或关键帧,包含创建完整图片需要的所有数据,每个GOP都正好有一个I-frames.它是一个独立帧,其尺寸是最大的,但也是解压最快的。
- P-frames:又称预测帧,是从基于最近的I-frames或P-frames的可预测的图片进行解码得到的。P-frames可以引用最近的预测P-frames或一组I-frames。
- B-frames:B-frames又称为双向帧,是基于使用之前和之后的帧信息进行编码后得到的帧。几乎不需要存储空间,但其解压过程会耗费较长时间,因为它依赖于周围其他的帧。
H.264还支持编码视图,用于确定在整个编码过程中所使用的算法。共定义了3个高级标准:
- Baseline:提供了最低效的压缩,压缩后的文件扔较大,但同时计算强度最小的方法,因为它不支持B-frames。年代久远的iOS设备如iPhone 3GS,可能会用到此标准
- Main:这个标准的计算强度要比Baseline的高,因为它使用的算法更多,但可以达到比较高的压缩率
- High:高标准的方法会得到最高质量的压缩效果,但它也是3种方法中计算复杂度最高的,因为所有能用到的编码计数和算法几乎都用到了
- Apple ProRes
Apple ProRes被认为是一个中间件或中间层编码器,因为它的目的是为专业编辑和生成工作流服务。Apple ProRes编解码器是独立于帧的,意味着只有I-frames可以被使用,这就使其更适合用在内容编辑上。此外,Apple ProRes还使用可变比特率编码的方式来对复杂场景中的每一帧进行编码。
ProRes是有损编解码器,但是它具有最高的编解码器质量。
ProRes编解码器只在OS上使用,iOS开发只能使用H.264。
3.3.4 音频编解码器
AAC
高级音频编码(AAC)是H.264标准相应的音频处理方式,目前已成为音频流和下载的音频资源中最主流的编码方式。这种格式比MP3格式有着显著的提升,可以在低比特率的前提下提供更高质量的音频,是在Web上发布和传播的音频格式中最为理想的。此外,AAC没有来自证书和许可方面的限制,这一限制曾经在MP3格式上饱受诟病
注意
AVFoundation和Core Audio提供对MP3数据解码的支持,但是不支持对其进行编码
3.4 容器格式
容器格式被认为是元文件格式。从更高的角度看,可将容器格式视为包含一种或更多种媒体类型(以及描述其内容的元数据的)目录。比如QuickTime文件可以包含多种不同的媒体类型,包括视频、音频、字幕和章节信息等,并且包含用于描述每个媒体片段细节的元数据。
当使用AVFoundation编写代码时,将遇到两类主要的容器格式,它们分别是:
-
QuickTime:QuickTime是苹果公司在更宏观QuickTime架构中定义的最常用格式。
-
MPEG-4:MPEG-4(MP4)是从QuickTime规范中直接派生出来的一种行业标准格式,所以这两个规范在结构和功能方面非常类似。MP4容器格式的官方文件扩展名是.mp4,但也有很多不同的变化扩展名。这些变化的扩展名仍然使用相同的基本MP4容器格式,它们通常用来区分一些特定的媒体类型,如m4a格式的音频文件,还可以使用这些扩展名来标识一些基本的MP4容器,如m4v格式的视频文件
4.AVFoundation初体验:文字转语音
AVFoundation文字转语音使用AVSpeechSynthesizer
来播放AVSpeechUtterance
,简单示例代码如下
import UIKit
import AVFoundation
class LWSpeechViewController: BaseViewController {
var voices: [AVSpeechSynthesisVoice?] = [AVSpeechSynthesisVoice(language: "en-US"),AVSpeechSynthesisVoice(language: "zh-CN")]
let strings: [String] = ["If equal affection cannot be, let the more loving be me","Whatever your past has been, you have a spotless future.","Embrace the glorious mess that you are.","You can't expect him to be perfectnobody is.","Life is a load of running, it is necessary to constantly in each choose a fork in the road.","Sometimes your whole life boils down to one insane move. ","I love you not for who you are, but for who I am with you.","Don't fear you forsake, just afraid of losing you.","If you are ever in trouble, don't try to be brave, just run, just run away. ","We all have a past. It’s how you deal with it.","如果没有相等的爱,那就让我爱多一些吧。","无论过去如何,未来总是崭新的。","无论如何,拥抱活得一团糟的自己。","别期待他是完美的,没人是完美的。","人生是一场负重的奔跑,需要不停地在每一个岔路口做出选择。","人一生中出人头地的机会不多,一旦有了一定要抓住机会。","我爱你不是因为你是谁,而是我在你面前可以是谁。","不是怕你丢弃,只是怕失去你。","你若遇上麻烦,不要逞强,你就跑,远远跑开。","每个人都有过去,只是取决于你怎么去处理。"]
//文字转语音的类
lazy var synthesizer: AVSpeechSynthesizer = {
let syn = AVSpeechSynthesizer()
return syn
}()
override func viewDidLoad() {
super.viewDidLoad()
var i = 0
for string in strings {
//播放语句
let utterance = AVSpeechUtterance(string: string)
if i <= 9 {
utterance.voice = voices[0]
} else {
utterance.voice = voices[1]
}
//播放速率 需要设置AVSpeechUtteranceMinimumSpeechRate和 AVSpeechUtteranceMaximumSpeechRate之间
utterance.rate = AVSpeechUtteranceDefaultSpeechRate
//音调:0.5-2.0之间 默认1
utterance.pitchMultiplier = 0.8
//指定播放下一个之间的停顿时间
utterance.postUtteranceDelay = 0.1
//使用speak方法,将语句加入队列中,会按照加入顺序一个个播放
synthesizer.speak(utterance)
i += 1
}
}
}
网友评论