AVFoundation框架解析(三)—— 几个关键问题之关于框架的深度概括

版本记录

版本号 时间
V1.0 2017.08.29

前言

AVFoundation框架是ios中很重要的框架,所有与视频音频相关的软硬件控制都在这个框架里面,接下来这几篇就主要对这个框架进行介绍和讲解。感兴趣的可以看我上几篇。
1. AVFoundation框架解析(一)—— 基本概览
2. AVFoundation框架解析(二)—— 实现视频预览录制保存到相册

关于AVFoundation

AVFoundation是您可以用来播放和创建基于时间的视听媒体的几个框架之一,它提供了一个Objective-C接口,你可以使用这个接口用于基于时间的视听数据的详细级别。 例如,您可以使用它来检查,创建,编辑或重新编码媒体文件。你还可以在实时捕获和播放期间从设备获取输入流并操纵视频。 下图显示了其在iOS上的体系结构。

框架在ios体系内的位置

下图展示的是AVFoundation在OS X中的结构或位置。

框架在OS X中的位置

你应该通常使用可用的最高级别抽象,使您可以执行所需的任务:

  • 如果您只想播放电影,请使用AVKit框架
  • 在iOS上,当您只需要最少的格式控制时录制视频,请使用UIKit框架(UIImagePickerController)。

但请注意,您在AV Foundation中使用的一些原始数据结构(包括与时间相关的数据结构和不透明对象携带和描述媒体数据)在Core Media框架中声明。


进一步剖析AV Foundation

AV Foundation框架包括两个部分,一部分是与视频有关的API,另外一个部分是只与音频有关的API,旧的与音频相关的类提供了处理音频的很好的方式。

你可以使用AVAudioSession配置你程序中的音频行为。

1. 使用AVFoundation展示和使用媒体

AVFoundation框架中用来展示媒体的主要类是AVAsset,框架的设计在很大程度上取决于这一表示。理解它的结构会帮你理解框架的工作方式,一个AVAsset对象是一个或多个媒体数据(音频和视频轨道)的集合的聚合表示。 它提供关于整个集合的信息,例如其标题,持续时间,自然呈现大小等。AVAsset不受特定数据格式的限制。它是其他类的超类,用于从URL中的媒体创建资产实例并创建新组合。

资产中的每个媒体数据片段都是统一的类型,称为轨道。在典型的简单情况下,一个轨道表示音频分量,另一个表示视频分量; 然而,在复杂的组合中,音频和视频可能存在多个重叠的轨道。资产也可能有元数据。

AVFoundation框架中一个重要的概念就是,初始化一个asset或者轨道对象,并不一定意味着它可以使用。甚至可能需要一些时间来计算项目的持续时间(例如,MP3文件,可能不包含摘要信息)。而不是在计算值时阻止当前线程,您可以通过使用块定义的回调异步获取值并获取答案。

2. 回放

AVFoundation允许您以复杂的方式管理资产的回放。 为了支持这一点,它将资产的呈现状态与资产本身分开。这就允许你,例如,同时以不同的分辨率,播放同一个资源的不同部分。资产的呈现状态由播放器项目对象管理, 资源内的每个轨道的呈现状态由播放器项目轨道对象管理。使用播放器对象项目和播放器项目轨道,你可以,例如,设置播放器呈现项目的可视部分的大小,设置要在播放过程中应用的音频混合参数和视频合成设置,或在播放过程中禁用该资源的组件。

您可以使用播放器对象播放播放器内容项目,并将播放器的输出定向到Core Animation层。您可以使用播放器队列按顺序调度播放器项目集合内容的播放。

3. 资源的读、写和重编码

AVFoundation允许您以多种方式创建资源的新的表示,你可以简单的对资源进行重编码,或者在iOS 4.1 及以后,你可以对资源的内容执行操作,并将结果另存为新资源。

你可以使用导出会话将现有存在的资源重新编码为由少数常用预设之一定义的格式。如果您需要对转换的更多控制,则在iOS 4.1及更高版本中,您可以一起使用资源读取器和资源编写器对象将资源从一个表示转换为另一个表示。

使用这些对象,例如,您可以选择要在输出文件中表示的轨道,指定您自己的输出格式,或在转换过程中修改资源。

要产生波形的视觉展示,您可以使用资源读取器来读取资产的音轨。

4. 缩略图

要创建视频演示文稿的缩略图,您可以使用要从中生成缩略图的资产初始化AVAssetImageGenerator的实例。AVAssetImageGenerator使用默认启用的视频轨道生成图像。

5. 编辑

AVFoundation使用组合从现有的媒体片段(通常是一个或多个视频和音轨)创建新的资源。您还可以设置音轨的相对音量和斜坡,并设置视频轨道的不透明度和不透明度斜坡。一个组合是在记忆体中保存的一组媒体。 使用导出会话导出作品时,它会折叠到一个文件。

您还可以使用资源编写器从媒体介质(如样本缓冲区或静态图像)创建资源。

6. 静态和视频媒体采集

从摄像机和麦克风录制输入由拍摄会话管理。 采集会话协调从输入设备到诸如电影文件之类的输出的数据流。即使会话正在运行,也可以为单个会话配置多个输入和输出。 您发送消息到会话以启动和停止数据流。

此外,您可以使用预览图层的实例向用户显示相机正在录制的内容。

7. AVFoundation并发编程

来自AVFoundation调用块,键值观察器和通知处理程序的回调不能保证在任何特定的线程或队列上进行,相反,AVFoundation会在执行其内部任务的线程或队列上调用这些处理程序。

就通知和线程而言,有两个基本准则:

  • 与UI相关的通知在主线程发生
  • 要求您创建和/或指定队列的类或方法将返回该队列上的通知。

除了这两个基本准则,您不应该假设在任何特定的线程上返回通知。

如果您正在编写多线程应用程序,则可以使用NSThread方法isMainThread[[NSThread currentThread] isEqual:<#A stored thread reference#>]来测试调用线程是否是您希望执行工作的线程。您可以使用以下方法将消息重定向到相应的线程:performSelectorOnMainThread:withObject:waitUntilDone:performSelector:onThread:withObject:waitUntilDone:modes:

您也可以使用dispatch_async在适当的队列上“弹回”到您的块,用于UI任务的主要队列或用于并发操作的队列。


先决条件

AVFoundationCocoa Framework里比较高级的框架了,为了有效的使用,你必须做到如下几点:

  • 对基础Cocoa开发工具和技术的牢固的了解。
  • block的基本理解
  • 对KVC和KVO的基本理解
  • 对于播放,要对Core AnimationAVKit框架有基本的了解。

后记

未完,待续~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容