AVFoundation开发秘籍笔记:第1章:AVFoundation入门

1.1 AV Foundation的含义

AVFoundation是苹果OSX系统和iOS系统中用于处理基于时间的媒体数据的高级Objective-C框架。高度依赖多线程机制,充分利用了多核硬件的优势并大量使用block和GrandCentral Dispatch(GCD)机制将复杂的计算进程放在后台线程运行。会自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。充分考虑了电量效率来满足诸如iPhone和iPad这类移动设备对电量控制的高要求。

1.2 AV Foundation的适用范围

几个最主要的支撑框架及其提供的功能。

  • Core Audio
    Core Audio是OS X和iOS系统上处理所有音频事件的框架。Core Audio是由多个框架整合在一起的总称,为音频和MIDI内容的录制、播放和处理提供相应接口。Core Audio也提供高层级的接口,比如通过Audio Queue Services框架所提供的那些接口,主要处理基本的音频播放和录音相关功能。同时还会提供相对低层级的接口,尤其是Audio Units接口,它们提供了针对音频信号进行完全控制的功能,并通过Audio Units让你能够构建一些复杂的音频处理模式。

  • Core Video
    Core Video是OS X和iOS系统上针对数字视频所提供的管道模式。Core Video为其相对的Core Media提供图片缓存和缓存池支持,提供了一个能够对数字视频逐帧访问的接口。该框架通过像素格式之间的转换并管理视频同步事项使得复杂的工作得到了有效简化。

  • Core Media
    Core Media是AV Foundation所用到的低层级媒体管道的一部分。 它提供针对音频样本和视频帧处理所需的低层级数据类型和接口。Core Media还提供了AV Foundation用到的基于CMTime数据类型的时基模型。CMTime及其相关数据类型一般在AV Foundation处理基于时间的操作时使用。

  • Core Animation
    合成及动画相关框架。主要功能就是提供苹果平台所具有的美观、流畅的动画效果。提供了一个简单、声明性的编程模式,并已经封装了支持OpenGL和OpenGL ES功能的基于Objective-C的各种类。使用Core Animation时,对于视频内容的播放和视频捕获这两个动作,AV Foundation提供了硬件加速机制来对整个流程进行优化。AV Foundation还可以利用Core Animation让开发者能够在视频编辑和播放过程中添加动画标题和图片效果。

    AVFoundation处于高层级框架和低层级框架之间。提供了很多低层级框架才能实现的功能和性能,以更简单的Objective-C接口方式实现的。也可以和高层级的框架无缝衔接,比如MediaPlayer和Assets Library,使用这两个框架所提供的服务并在需要更高级的功能时,也可以直接与Core Media和Core Audio进行交互。

1.3 AV Foundation所提供的一些核心功能

1.3.1 音频播放和记录
AVAudioPlayer和AVAudioRecorder可以在应用程序中提供一种更简单的整合音频播放和记录的功能。但不是AV Foundation用于播放和记录音频的唯一方式。

1.3.2 媒体文件检查
可以查看这些媒体资源信息,比如是否可以回放、被编辑和导出。
获取该媒体资源相关的技术参数,比如内容持续时间、创建日期或首选播放音量等。
该框架还基于AVMetadataltem类提供功能强大的元数据支持,允许开发者读写关于媒体资源的描述信息。

1.3.3 视频播放
播放从本地文件或远程流中获取的视频资源,并对视频播放和内容的展示进行控制。
核心类:AVPlayer和AVPlayerItem。
其他更高级的功能,如控制子标题和章节信息等。或者让你接连访问音频和视频这两个不同的资源。

1.3.4 媒体捕捉
核心类是AVCaptureSession,其作为所有活动的汇集点来接收摄像头设备由各路流发过来的电影和图片。

1.3.5 媒体编辑
允许创建可以将多个音频和视频资源进行组合的应用程序,允许修改和编辑独立的媒体片段、随时修改音频文件的参数以及添加动画标题和场景切换效果。

1.3.6 媒体处理
访问更底层的数据并对其进行操作。当需要执行更高级的媒体处理任务时,使用AVAssetReader和AVAssetWriter类来实现这些功能。这些类提供直接访问视频帧和音频样本的功能,所以可以对媒体资源进行任何更高级的处理。

1.4 了解数字媒体

现实生活中的信号是连续的,信号的频率和强度是在不断变化的;但是数字世界的信号是离散的,由1和0两个状态表示。要将模拟信号转换成我们能够存储并传输的数字信号,要经过模拟-数字转换过程,我们将这个过程称为采样(Sampling)。

1.4.1 数字媒体采样

主要有两种方式。

1、时间采样:捕捉一个信号周期内的变化。

2、空间采样:图片数字化和其他可视化媒体内容数字化的过程中。
空间采样包含对一幅图片在一定分辨率之下捕捉其亮度和色度,进而创建由该图片的像素点数据所构成的数字化结果。

当对一段视频进行数字化时,这两种方式都可以使用,因为通常的视频信号既有空间属性又有时间属性。

1.4.2 音频采样
人类可以听到的音频范围是20Hz~20kHz(20 000Hz)。

1.5 数字媒体压缩

为缩小数字媒体文件的大小,我们需要对其使用压缩技术。

1.5.1 色彩二次抽样

视频数据是使用称之 为Y'CbCr颜色模式的典型案例,Y'CbCr也常称为YUV。

图片的所有细节都保存在亮度通道中。眼睛对亮度的敏感度要高于颜色,大幅减少存储在每个像素中的颜色信息,而不至于图片的质量严重受损。

减少颜色数据的过程就称为色彩二次抽样。

摄像头规范和其他视频设备硬件或软件中提到的4:4:4、4:2:2及4:2:0时,这些值的含义就是这些设备所使用的色彩二次抽样的参数。根据这些值按如下格式将亮度比例表示为色度值,这个格式写作J:a:b,具体含义如下:
J:几个关联色块(一般是4个)中所包含的像素数。
a:用来保存位于第一行中的每个J像素的色度像素个数。
b:用来保存位于第二行中的每个J像素的附加像素个数。

1.5.2 编解码器压缩

大部分音频和视频都是使用编解码器(codec)来压缩的。编解码器使用高级压缩算法对需要保存或发送的音频或视频数据进行压缩和编码,同时它还可以将压缩文件解码成适合播放和编辑的媒体资源文件。

编解码器既可以进行无损压缩也可以进行有损压缩。

无损压缩编解码器以一种可以完美重构解码的方式对媒体文件进行压缩,使其成为无论编辑还是发布都比较理想的文件。

有损编解码器就是在压缩过程中会有部分数据损失掉。

1.5.3 视频编解码器

AV Foundation提供有限的编解码器集合,只提供苹果公司认定的目前最主流的几种媒体类型的支持。具体对于视频文件来说,主要可以归结为H.264和Apple ProRes。

  1. H.264
    H.264规范是Motion Picture Experts Group(MPEG)所定义的MPEG-4的一部分。 H.264遵循早期的MEPG-1和MPEG-2标准,但是在以更低比特率得到更高图片质量方面有了长足进步,使其更好地用 于流媒体文件和移动设备及视频摄像头。

H.264与其他形式的MPEG压缩一样,通过以下两个维度缩小了视频文件的尺寸:
●空间:压缩独立视频帧,被称为帧内压缩。
●时间:通过以组为单位的视频帧压缩冗余数据,这一过程称为帧间压缩。

帧内压缩通过消除包含在每个独立视频帧内的色彩及结构中的冗余信息来进行压缩,因此可在不降低图片质量的情况下尽可能缩小尺寸。帧内压缩也可以作为有损压缩算法,但通常用于对原始图片的一部分进行处理以生成极高质量的照片。通过这一过程创建的帧称 为I-frames。

帧间压缩中,很多帧被组合在一起作为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以被消除。

GOP中的三个不同类型的帧。


●I-frames: 这些帧都是一些单独的帧或关键帧,包含创建完整图片需要的所有数据。每个GOP都正好有一个I-frames。 由于它是一个独立帧,其尺寸是最大的,但也是解压最快的。
●P-frames: P-frames又称为预测帧,是从基于最近I-frames或P-frames的可预测的图片进行编码得到的。P-frames 可以引用最近的预测P-frames或一组 I-frames。你将会经常看到这些被称为“reference frames"的帧,临近的P-frames和B-frames都可以对其进行引用。
●B-frames: B-frames 又称为双向帧,是基于使用之前和之后的帧信息进行编码后得到的帧。几乎不需要存储空间,但其解压过程会耗费较长时间,因为它依赖于周围其他的帧。

H.264还支持编码视图,用于确定在整个编码过程中所使用的算法。共定义了3个高级标准:
●Baseline:这个标准通常用于对移动设备的媒体内容进行处理,提供了最低效的压缩,因此经过这个标准压缩后的文件仍较大,但是同时这种方法也是最少计算强度的方法,因为它不支持B-frames。如果开发者的编译目标是年代比较久远的iOS设备,比如iPhone 3GS,可能需要用到Baseline标准。
●Main: 这个标准的计算强度要比Baseline的高,因为它使用的算法更多,但可以达到比较高的压缩率。
●High: 高标准的方法会得到最高质量的压缩效果,但它也是3种方法中计算复杂度最高的,因为所有能用到的编码技术和算法几乎都用到了。

  1. Apple ProRes

专业编辑和生产工作流服务。
Apple ProRes编解码器是独立于帧的,意味着只有I-frames可以被使用,这就使其更适合用在内容编辑上。
Apple ProRes还使用可变比特率编码的方式来对复杂场景中的每一帧进行编码。

ProRes是有损编解码器,但是它具有最高的编解码质量。Apple ProRes 422使用4:2:2的色彩二次抽样和10位的采样深度。Apple ProRes 4444使用4:4:4色彩二次抽样,具有最终4个用于表示支持无损alpha通道和高达12位的采样深度。

ProRes编解码器只在OS X上可用。如果开发者只针对iOS进行开发工作,只能使用H.264。

注意:
对H.264和Apple ProRes来说,AV Foundation 还支持很多摄像头设备的编解码器,如MPEG-1、MPEG-2、MPEG-4、H.263 和DV,允许用户以多种不同的视频捕捉设备导入内容资源。

1.5.4 音频编解码器

只要是Core Audio框 架支持的音频编解码,AV Foundation都可以支持,这意味着AVFoundation能够支持大量不同格式的资源。然而在不用线性PCM音频的情况下,更多的只能使用AAC。

AAC
高级音频编码(AAC)是H.264标准相应的音频处理方式,目前已成为音频流和下载的音频资源中最主流的编码方式。这种格式比MP3格式有着显著的提升,可以在低比特率的前提下提供更高质量的音频,是在Web上发布和传播的音频格式中最为理想的。此外,AAC没有来自证书和许可方面的限制。

注意:
AVFoundation和CoreAudio提供对MP3数据解码的支持,但是不支持对其进行编码。

1.6 容器格式

容器格式(container format):文件类型。

容器格式被认为是元文件格式。可将容器格式视为包含一种或更多种媒体类型(以及描述其内容的元数据)的目录。

每种格式都有一个规范用于确定文件的结构。所谓的结构并不仅是其包含的媒体资源技术领域的问题,比如媒体的周期、编码和时间信息,还定义了描述性原数据。这些元数据可以通过工具进行呈现。

当开发者使用AV Foundation撰写代码时,将遇到两类主要的容器格式,它们分别是:

● QuickTime: QuickTime 是苹果公司在更宏观QuickTime架构中定义的最常用格式。

● MPEG-4: MPEG-4 Part14规范定义MPEG 4(MP4)容器格式。

1.7 初识AV Foundation

NSSpeechSynthesizer类:“文本到语音”功能。可以播放一个或多个语音内容,这些语音内容都是名为AVSpeechUtterance的类的实例。

实现代码如下所示:

#import "ViewController.h"
#import 

@interface ViewController ()

@property (nonatomic, strong) AVSpeechSynthesizer   *synthesizer;
@property (nonatomic, strong) NSArray               *voices;
@property (nonatomic, strong) NSArray               *speechStrings;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    for (NSUInteger i = 0; i < self.speechStrings.count; i++) {
        AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.speechStrings[i]];// 1
        utterance.voice              = self.voices[i % 2];  // 2在预先定义的两个语音之间向后或向前进行切换
        utterance.rate               = 0.5f;                // 3播放语音内容的速率
        utterance.pitchMultiplier    = 0.8f;                // 4改变声音的音调,介于0.5(低音调)和2.0(高音调)之间
        utterance.postUtteranceDelay = 0.1f;                // 5在播放下一语句之前有短时间的暂停
        [self.synthesizer speakUtterance:utterance];        // 6播放
    }
}

#pragma mark - 懒加载
- (AVSpeechSynthesizer *)synthesizer {
    if (_synthesizer != nil) {
        return _synthesizer;
    }
    
    _synthesizer = [[AVSpeechSynthesizer alloc] init];
    
    return _synthesizer;
}

- (NSArray *)voices {
    if (_voices != nil) {
        return _voices;
    }
    
    _voices = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],
                [AVSpeechSynthesisVoice voiceWithLanguage:@"en-GB"]];
    
    return _voices;
}

- (NSArray *)speechStrings {
    if (_speechStrings != nil) {
        return _speechStrings;
    }
    
    _speechStrings = @[@"Hello AV Foundation. How are you?",
                       @"I'm well! Thanks for asking.",
                       @"Are you excited about the book?",
                       @"Very! I have always felt so misunderstood.",
                       @"What's your favorite feature?",
                       @"Oh, they're all my babies.  I couldn't possibly choose.",
                       @"It was great to speak with you!",
                       @"The pleasure was all mine!  Have fun!"];
    
    return _speechStrings;
}
@end

你可能感兴趣的:(AVFoundation开发秘籍笔记:第1章:AVFoundation入门)