AVFoundation开发秘籍笔记-01AVFoundation入门

一、概述

AVFoundation是可以用它来播放和创建基于时间的视听媒体的几个框架之一,它提供了基于时间的视听数据的详细界别上的OC接口。可以用它来检查、创建、编辑、重新编码媒体文件。也可以从设备得到输入流和实时捕捉回放过程中操控视频

用于处理基于时间的媒体数据的高级OC框架。充分利用了多核硬件的优势并大量使用block和Grand Central Dispatch(GCD)机制将复杂的计算进程放在后台线程运行。自动提供硬件加速操作,确保在大部分设备上应用程序能以最佳性能运行。

二、适用范围

AVFoundtion_iOS.png
AVFoundation_OSX.png

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

  • Core Audio
    OSX和iOS上处理所有音频事件的框架,是由多个框架整合在一起的总称。为音频和MIDI内容的录制、播放和处理提供相应接口,也提供高层级的接口,比容通过Audio Queue Services框架所提供的那些接口,主要处理基本的音频播放和录音相关功能。也提供相对低层级的接口。

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

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

  • Core Animation
    合成及动画相关框架。主要功能是提供苹果平台所具有的美观、流畅的动画小狗。提供一个简单、声明性编程模式,并已经封装了支持OpenGL和OpenGL ES功能的基于OC的各种累。使用Core Animation时,对于视频内容的播放和视频不捕捉这两个动作?AV还可以利用Core Animation在视频编辑和播放过程中添加动画标题和图片效果。

AV处于高层级框架和低层级框架之间,提供了很多低层级框架才能实现的功能和性能,并且是以更简单的OC接口方式实现,同时也可以和高层级框架无缝连接。

三、AV功能分解

  • 1、音频播放和记录。播放音频文件可以使用AVAudioPlayer,录制音频文件可以使用AVAudioRecorder。还可以使用AVAudioSession来配置应用程序的音频行为。
  • 2、媒体文件检查。提供检查正在使用的媒体文件的功能。可以查看媒体资源信息,比如是否可以回放、编辑、导出等,可以获取相关技术参数,比如内容持续时间,创建日期、播放音量等,此外还基于AVMetadataItem类提供功能强大的元数据支持。允许开发者读取关于媒体资源的描述信息。
  • 3、视频播放。AV提供可以播放从本地或者远程流中获取的视频资源,并对视频播放和内容的展示进行控制。核心类是AVPlayerAVPlayerItem,此外还可以整合其他更高级的功能,如控制子标题和章节信息等。
  • 4、媒体捕捉。核心类是AVCaptureSession,作为所有活动的汇集点来接受摄像头设备由各路流反过来的电影和图片。是用来管理数据捕捉的中央协调对象,使用一个实例来协调从AV输入设备到输出的数据流。
  • 5、媒体编辑。对媒体资源的整合和编辑提供了强有力的支持。允许修改和编辑独立的媒体片段、随时修改音频文件的参数以及添加动画标题和场景切换效果。
  • 6、媒体处理。当需要执行更高级的媒体处理任务是,可以用AVAssetReaderAVAssetWriter类来实现这些功能。这些类提供了直接访问视频帧和音频样本的功能,可以对媒体资源进行任何更高级的处理。

四、了解数字媒体

了解信号的数字化过程。

视频文件一秒内所能展现的帧数成为视频的帧率,用FPS作为单位进行测量。常见的帧率是24FPS、25FPS、30FPS。

目前视频最流行的宽高比是16:9,意思是没16个水平像素对应9个垂直像素。常见视频尺寸为1280*720,1920*1080。

如果每个像素点使用8位RGB色彩空间,这意味着红色8位,绿色8位,蓝色8位。

现在问题来了,一个帧率为30FPS,分辨率是1920*1080的视频存储需求就是:1920*1080 * 30 * 24 (b/s)

五、数字媒体压缩

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

1、色彩二次抽样

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

对RGB模式来说,每个像素是由红、绿、蓝三种颜色组合而成,而YUV使用的是色彩通道UV(颜色)替换了像素的亮度通道Y(亮度)。眼睛对于亮度的敏感度要高于颜色,所以可以大幅度减少存储在每个像素中的颜色信息,不至于是图片质量严重受损,减少颜色数据的过程就成为色彩二次抽样。

2、编解码器压缩。

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

3、视频编解码器。

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

3.1、H.264

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

H.264与其他形式的MPEG压缩一样,通过以下两个纬度缩小了视频文件的大小:

  • 1、空间:压缩独立视频帧,称为帧内压缩
  • 2、时间:通过以组为单位的视频帧压缩冗余数据,称为帧间压缩

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

帧间压缩,很多帧被组合在一起成为一组图片(简称GOP),对于GOP所存在的时间维度的冗余可以被消除。在一个时间维度上的冗余,如视频的固定背景环境,就可以通过压缩的方式进行消除。

GOP中三种不同的帧:

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

H.264还支持编码视图,用于确定在整个编码过程中所使用的算法定义三个高级标准:

  • 1、 Baseline:通常用于对移动设备的媒体内容进行处理,提供最低效的压缩,因此经过这个标准压缩后的文件仍较大,但同时这种方法也是最少计算强度的方法,因为它不支持B-frames。如果编译目标是比较久远的iOS设备,可能需要用到Baseline标准。
  • 2、Main:这个标准的计算强度比Baseline的高,使用的算法更多,但可以达到较高的压缩率
  • 3、High:高标准的方法会得到最高质量的压缩效果,但它也是三总方法中计算复杂度最高的,因为所有能用到的编码技术和算法几乎都用到了。

3.2、Apple ProRes

ProRes编解码器只在OSX上使用,针对iOS进行开发,只能使用H.264

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

4、音频编解码器

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

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

AVCore Audio提供对MP3数据解码的支持,但不支持对齐进行编码。

六、容器格式

容器格式(container fromat)就是文件类型,或者说文件格式,比如.mov.mp4.mpgavi等。

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

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

使用AV是,将遇到两种主要的容器格式:

  • 1、QuickTime,是苹果公式在更宏观QuickTime架构中定义的最常用格式。需阅读文档了解。
  • 2、MPEG-4,MP4容器格式官方文件扩展名是.mp4,也有很多不同的变化扩展名也在使用。

七、AVFoundation文本到语音功能

通过AVSpeechSynthesizer实现文本到语音功能。这个类用来播放一个或多个语音内容,这些语音内容为AVSpeechUtterance的类的实例。

e.g.

#import "LFSpeechViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface LFSpeechViewController ()

//执行具体的“文本到语音”回话。对于一个或多个AVSpeechUtterance实例,
//该对象起到队列的作用,提供了接口供控制和见识正在进行的语音播放。
@property (nonatomic,strong) AVSpeechSynthesizer *synthesizer;

@property (nonatomic,strong) NSArray *voicesArray;

@property (nonatomic,strong) NSArray *speechStringsArray;

@end

@implementation LFSpeechViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _synthesizer = [[AVSpeechSynthesizer alloc] init];
    
    _voicesArray = @[[AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"],[AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"],];
//    AVSpeechSynthesisVoice 设置语音支持。
//    [AVSpeechSynthesisVoice speechVoices]获取所有支持的语音类型。
    
    _speechStringsArray = [self buildSpeechStrings];
    
    NSLog(@"%@",[AVSpeechSynthesisVoice speechVoices]);
}
- (IBAction)beginButtonClicked:(UIButton *)sender {
    [self beginConversation];
}

- (void)beginConversation {
    for (int i = 0; i < self.speechStringsArray.count; i++) {
        AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:self.speechStringsArray[i]];
        utterance.voice = self.voicesArray[i%2];//语音
        utterance.rate = 0.4f;
        //播放语音内容的速率,默认值AVSpeechUtteranceDefaultSpeechRate=0.5。
        //这个值介于AVSpeechUtteranceMinimumSpeechRate和AVSpeechUtteranceMaximumSpeechRate之间(目前是0.0-1.0)
        //这两个值是常量,在以后iOS版本中可能会发生变化,可以按照最小值和最大值的范围百分比进行计算。
        NSLog(@"min:%f-max:%f-default:%f",AVSpeechUtteranceMinimumSpeechRate,AVSpeechUtteranceMaximumSpeechRate,AVSpeechUtteranceDefaultSpeechRate);
        utterance.pitchMultiplier = 0.8f; //在播放特定语句是改变声音的音调,允许值介于0.5-2.0之间。
        utterance.postUtteranceDelay = 0.1f; //语音合成器在播放下一语句之前有段时间的暂停。
        [self.synthesizer speakUtterance:utterance];
    }
}

- (NSArray *)buildSpeechStrings {
    return  @[@"Hello,How are you ?",
              @"I'm fine ,Thank you. And you ?",
              @"I'm fine too.",
              @"人之初,性本善。性相近,习相远。苟不教,性乃迁。教之道,贵以专。昔孟母,择邻处。子不学,断机杼。窦燕山,有义方。教五子,名俱扬。养不教,父之过。教不严,师之惰。子不学,非所宜。幼不学,老何为。玉不琢,不成器。人不学,不知义。为人子,方少时。亲师友,习礼仪。香九龄,能温席。孝于亲,所当执。融四岁,能让梨。弟于长,宜先知。",
             ];
}

@end

八、任务:阅读AVFoundation文档

推荐阅读更多精彩内容