三十四

三十四
音视频
AVFoundation 是 Objective-C 中创建及编辑视听媒体文件的框架之一,提供了检查、创建、编辑或重新编码媒体文件的接口,也使得从设备获取的视频实时数据可操纵。通常情况,简单的播放或者录像,直接使用 AVKit 框架或者 UIImagePickerController 类即可。另外,在 AVFoundation 框架中使用的基本数据结构,时间相关的或描述媒体数据的数据结构都声明在 CoreMedia 框架中。

AVFoundation 是 OSX 系统和 iOS 系统中用于处理基于时间的媒体数据的高级 objectivec 框架,设计过程高度依赖多线程机制,充分利用了多核硬件优势,大量使用 Block 和 GCD 机制。AVFoundation 能与高层级框架无缝衔接,也能提供低层级框架的功能和性能。

Core Audio
Core Audio是OS X和IOS系统上处理所有音频 事件的框架。Core Audio是有多高框架整合在一起的总称,为音频和MIDI内容的录制,播放和处理提供相应的接口。Core Audio也提供高级的接口,比如通过Audio Queue Services框架所提供的那些接口,主要处理基本的音频播放和录音相关功能。同时还会提供相对低层级的接口,尤其是Audio Units接口,它们提供了针对音频信号进行完全控制的功能,并通过Audio Units让你能够构建一些复杂的音频处理模式,就像通过苹果公司的Logic Pro X和Avid’s Pro Tolls工具所实现的功能一样。
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
Core Animation时OS X和 iOS 提供的合成及动画相关框架。主要功能就是提供苹果平台所具有的美观,流畅的动画效果。提供了一个简单,声明行的编程模式,并已经封装了支持OpenGL 和OpenGL ES 功能的基于Object-C的各种类。使用Core Animation时,对于食品内容的播放和视频捕获这两个动作,AVFoundation 提供了硬件加速机制来对整个流程进行优化。AVFoundation 还可以利用Core Animation让开发者能够在视频编辑和播放过程中添加动画标题和图片效果。

AVFoundation框架,可以用来检测,编辑,创建,重新编码媒体文件,还可以实时获取设备的流媒体数据,实时操作这些被捕获的视频流数据。
只是简单播放视频文件,使用AVKit框架即可。
只是想简单录制视频,使用UIKit框架里的UIImagePickerController既可以实现。
AVFoundation 框架包含视频相关的接口以及音频相关的接口,与音频相关的类有 AVAudioPlayer、AVAudioRecorder、AVAudioSession。

AVFoundation框架
AVFoundation 提供的核心功能:
音频播放和记录——AVAudioPlayer 和 AVAudioRecorder
媒体文件检查——AVMetadataItem
视频播放——AVPlayer 和 AVPlayerItem
媒体捕捉——AVCaptureSession
媒体编辑
媒体处理——AVAssetReader、AVAssetWriter

AVFoundation 框架中最基本的类是 AVAsset ,它是一个或者多个媒体数据的集合,描述的是整个集合的属性,如标题、时长、大小等,并且没有特定的数据格式。集合的每一个媒体数据都是统一的数据类型,称之为 track。简单的情况是一种数据是音频数据,一种是视频数据,而较复杂的情况是一种数据交织着音频和视频数据,并且 AVAsset 是可能有元数据的。
另外,在AVFoundation 中,初始化了 asset 及 track 后,并不意味着资源已经可用,因为若资源本身并不携带自身信息时,那么系统需要自己计算相关信息,这个过程会阻塞线程,所以应该使用异步方式进行获取资源信息后的操作。

AVFoundation 中可以使用 compositions 将多个媒体数据(video/audio tracks)合成为一个 asset ,这个过程中,可以添加或移除 tracks ,调整它们的顺序,或者设置音频的音量和变化坡度,视频容量等属性。这些媒体数据的集合保存在内存中,直到使用 export session 将它导出到本地文件中。另外,还可以使用 asset writer 创建 asset 。

使用 capture session 协调从设备(如相机、麦克风)输入的数据和输出目标(如视频文件)。可以为 session 设置多个输入和输出,即使它正在工作,还可以通过它停止数据的流动。另外,还可以使用 preview layer 将相机记录的影像实时展示给用户。

在 AVFoundation 中的回调处理并不保证回调任务在某个特定的线程或队列中执行,其遵循两个原则,UI 相关的操作在主线程中执行,其他回调需要为其指定调用的队列。

Assets
AVFoundation 之 AssetsAVAsset 是AVFoundation框架里的一个核心类,主要提供了一种形式独立的基于时间的视听数据抽象,例如电影文件或视频流。

AVAsset 包含需要一起呈现或处理的音轨集合,每个音轨都是统一的媒体类型,包括(但不限于)音频、视频、文本、封闭字幕和字幕。asset对象提供关于整个资源的信息,比如它的持续时间或标题,以及表示的提示,比如它的大小。AVAsset 也可以有元数据,由AVMetadataItem的实例表示。

跟踪由AVAssetTrack的实例表示,在一个典型的简单例子中,一个轨道表示音频组件,另一个表示视频组件;在一个复杂的组合中,音频和视频可能会有多个重叠的音轨。

音轨具有许多属性,其类型(视频或音频)、可视和/或可听特征(视情况而定)、元数据和时间轴(以其父资产的形式表示)。磁道也有一组格式说明。数组包含CMFormatDescription对象(参见CMFormatDescriptionRef),每个对象描述曲目引用的媒体样本的格式。包含统一媒体的磁道(例如,所有使用相同设置编码的磁道)将提供一个计数为1的数组。

一个磁道本身可以被分割成段,用AVAssetTrackSegment的实例来表示。段是从源到资产跟踪时间线的时间映射。

CMTime是一个C结构,它将时间表示为一个有理数,具有一个分子(int64_t值)和一个分母(int32_t时间刻度)。从概念上讲,时间刻度指定了分子中每个单位所占的秒数。因此,如果时间刻度是4,每个单元代表四分之一秒;如果时间刻度是10,每个单元表示十分之一秒,以此类推。您经常使用600的时间刻度,因为这是几种常用帧率的倍数:24帧用于电影,30帧用于NTSC(用于北美和日本的电视),25帧用于PAL(用于欧洲的电视)。使用600的时间刻度,您可以精确地表示这些系统中的任意数量的帧。除了简单的时间值之外,CMTime结构还可以表示非数值:+∞、-∞和不定。它还可以指示时间是否在某个点被四舍五入,并保持一个历元数。

可以使用CMTimeMake或CMTimeMakeWithSeconds等相关函数之一创建时间(该函数允许使用浮点值创建时间并指定首选时间刻度)。

AVFoundation 提供了多种方法来创建 asset ,可以简单的重编码已经存在的 asset ,这个过程可以使用 export session 或者使用 asset reader 和 asset writer 。

若要生成视频的缩略图,可以使用 asset 初始化一个 AVAssetImageGenerator 实例对象,它会使用默认可用的视频 tracks 来生成图片。

AVURLAssetPreferPreciseDurationAndTimingKey 是否需要资源的准确时长,及访问资源各个准确的时间点
AVURLAssetReferenceRestrictionsKey 链接其他资源的约束
AVURLAssetHTTPCookiesKey 添加资源能够访问的 HTTP cookies
AVURLAssetAllowsCellularAccessKey 是否能够使用蜂窝网络

创建并初始化一个 AVAsset 实例对象后,并不意味着该对象的所有属性都可以获取使用了,因为其中的一些属性需要额外的计算才能够得到,那么当获取这些属性时,可能会阻塞当前线程,所以需要异步获取这些属性。

AVAsset 与 AVAssetTrack 都遵循 AVAsynchronousKeyValueLoading 协议,这个协议中有以下两个方法:

//获取指定属性的状态- (AVKeyValueStatus)statusOfValueForKey:(NSString *)key error:(NSError * _Nullable * _Nullable)outError;//异步加载指定的属性集合- (void)loadValuesAsynchronouslyForKeys:(NSArray<NSString *> *)keys completionHandler:(nullable void (^)(void))handler;

我们使用上述第二个方法异步加载想要的属性,而后在加载完成的回调 block 中使用第一个方法判断属性是否加载成功

NSURL *url = <#资源路径#>;
AVURLAsset *anAsset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *keys = @[@“duration”,@“tracks”];[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { NSError *error = nil; AVKeyValueStatus tracksStatus = [asset statusOfValueForKey:@“tracks” error:&error];
//根据相应的属性状态进行对应的处理 switch (tracksStatus) { case AVKeyValueStatusUnknown: //TODO break; case AVKeyValueStatusLoading: //TODO break; case AVKeyValueStatusLoaded: //TODO break; case AVKeyValueStatusFailed: //TODO break; case AVKeyValueStatusCancelled: //TODO break; }}];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值