AVFoundation那些事儿(一)

AVFoundation那些事儿

作为MacOS 或 iOS开发者,在接触音视频等功能时,或多或少接触过这个框架,初见只道简单,细品才觉深奥,无论了解深浅、使用多少,都值得总结一番。

AVFoundation combines several major technology areas that together encompass a wide range of tasks for inspecting, playing, capturing, and processing audiovisual media on Apple platforms.

AVFoundation结合了几个主要的技术领域,包含了在苹果平台上检查、播放、拍摄和处理音视频媒体的广泛任务。

能做什么

  • 音频、视频的播放
  • 简单编辑功能,拼接视频、音量及透明度渐变、简单的水印动画等
  • 视频格式转换
  • 视频缩略图提取
  • 其他功能,如人脸识别等

不能做什么

  • 曲线变速等复杂功能无法单纯依靠该框架实现

概述

AVFoundation主要由两个方面组成,处理音视频部分的API和单纯处理音频的API构成。视频部分下述详细介绍,关于遗留的音频老API,它给我们提供了简洁高效的处理音频的方式。

  • 播放音频,使用AVAudioPlayer
  • 录制音频,使用AVAudioRecorder

更多音频操作使用AVAudioSession

表示及使用媒体资源的方式

AVAsset
AVFoundation中表示媒体资源的最重要的类,理解了它的结构后会加深AVFoundation的工作机制,很多功能也是基于它的规则实现,方便我们编辑及操作媒体数据。

An asset models file-based media like a QuickTime movie or an MP3 audio file, and also media streamed using HTTP Live Streaming (HLS). An asset is a container object for one or more instances of AVAssetTrack that model the uniformly typed tracks of media. The most commonly used track types are audio and video, but assets may also contain supplementary tracks, like closed captions, subtitles, and timed metadata.

简单理解它是我们需要使用的媒体资源的聚合类,包含了各种轨道资源,为我们提供媒体资源的标题、时长、大小等信息,最简单的结构是1个视频轨道、1个音频轨道;复杂结构可能包含多个视频轨道或者多个音频轨道,甚至可能会包含metadata信息。

初始化

假设我们已经通过Photo框架取到了本地媒体资源的URL:

let url: URL = // A local or remote asset URL.
let asset = AVAsset(url: url)

注意:如果需要精确的时长等信息,比如在编辑场景下我们精确优先效率,因此上述options参数需要传值AVURLAssetPreferPreciseDurationAndTimingKey来明确表示我们需要精确的时间信息。

let url: URL = // A local or remote asset URL.
let options = [AVURLAssetPreferPreciseDurationAndTimingKey: true]
let asset = AVURLAsset(url: url, options: options)

内部结构

它内部结构是这样的:
AVFoundation那些事儿(一)_第1张图片

很清晰的树形结构,注意AVAssetTrack每个类别可能有多个,上图只是列举部分,并不完整。

注意
初始化成功并不表示该资源准备好,它可能需要一定的时间计算时长等信息,因此需要异步加载属性信息。iOS16之后在子线程调用如下方法:

let (duration, metadata) = try await asset.load(.duration, .metadata)

可判断属性是否已经加载:

// Determine the loaded status of the metadata property.
switch asset.status(of: .metadata) {
case .notYetLoaded:
    // The initial state of a property.
case .loading:
    // The asset is actively loading the property value.
case .loaded(let metadata):
    // The property is ready to use.
case .failed(let error):
    // The property value fails to load.
}

有了上述基本认识,下面我们开始详细介绍通过AVFoundation实现播放、拍摄、编辑及导出等功能。

播放

等待更新中…

拍摄

等待更新中…

编辑

等待更新中…

导出

等待更新中…

总结

以上是本人在使用AVFoundation过程中遇到的问题,也是对该部分使用后的反思总结。如有错误,恳请各位批评指正!

你可能感兴趣的:(音视频,AVFoundation)