实战需求
SwiftUI AVKit 之合并和叠加音频mp3 并输出
本文价值与收获
看完本文后,您将能够作出下面的界面

看完本文您将掌握的技能
- 掌握 AVMutableComposition
- 掌握 AVURLAsset
- 掌握 CMTimeRange
- 掌握 AVAssetExportSession
- 掌握 insertTimeRange
基础知识
AVKit
使用视听资产,控制设备摄像头,处理音频并配置系统音频交互。
使用教程
创建用于媒体播放的视图级服务,包括用户控件,章节导航以及对字幕和隐藏式字幕的支持。
AVMutableComposition
一个可变的对象,用于根据现有资产创建新的合成。
class AVMutableComposition : AVComposition
总览
此类提供添加和删除轨道的功能,并且您可以添加,删除和缩放时间范围。您可以为可变组成作一个不变的快照,以进行回放或检查,如下所示:
AVMutableComposition *myMutableComposition =
<#a mutable composition you want to inspect or play in its current state#>;
AVComposition *immutableSnapshotOfMyComposition = [myMutableComposition copy];
// Create a player to inspect and play the composition.
AVPlayerItem *playerItemForSnapshottedComposition =
[[AVPlayerItem alloc] initWithAsset:immutableSnapshotOfMyComposition];
AVURLAsset
它的一个具体子类AVAsset用于从本地或远程URL初始化资产。
class AVURLAsset : AVAsset
AVAsset
用于对定时视听媒体(例如视频和声音)进行建模的抽象类。
可用性
class AVAsset : NSObject
总览
一个AVAsset定义组成资产的航迹的集体属性。AVAsset通过使用指向媒体资源的本地或远程URL对其进行初始化来创建一个,如以下示例所示:
let url: URL = // Local or Remote Asset URL
let asset = AVAsset(url: url)
AVAsset是一个抽象类,因此,如示例所示创建资产时,实际上是在创建其具体子类之一的实例AVURLAsset。在许多情况下,这是创建资产的合适方法,但是AVURLAsset当您需要对资产的初始化进行更细粒度的控制时,也可以直接实例化。的初始值设定项AVURLAsset接受一个选项字典,您可以使用该字典根据特定的用例定制资产的初始值。例如,如果您要为HLS流创建资产,则可能希望阻止用户将其连接到蜂窝网络时检索其媒体。您可以按照以下示例所示进行操作:
let url: URL = // Remote Asset URL
let options = [AVURLAssetAllowsCellularAccessKey: false]
let asset = AVURLAsset(url: url, options: options)
您还可以使用其他具体的子类实例化资产,这些子类可以以有用的方式扩展视听媒体的基本模型,就像AVComposition时间编辑一样。
CMTimeRange
时间范围表示为两个CMTime结构。
struct CMTimeRange
参考代码
let timeRange1 = CMTimeRangeMake(start: CMTime.zero, duration: duration1)
let timeRange = CMTimeRange(start: CMTimeMake(value: 0, timescale: 600), duration: track.timeRange.duration)
AVAssetExportSession
一个对资产源对象的内容进行代码转换以创建由指定的导出预设描述的形式的输出的对象。
class AVAssetExportSession : NSObject
总览
在初始化的实例之前,您可以用来获取可用预设的完整列表。使用以获取与特定资产兼容预设列表。
使用包含源媒体,导出预设名称()和输出文件类型()的资产初始化导出会话后,可以通过调用开始运行导出。由于导出是异步执行的,因此该方法会立即返回-您可以使用它来检查进度。根据设备的功能,当尝试多次导出时,某些导出可能会排队。发生这种情况时,已排队的导出操作的将会表明它正在等待()。
提供给您的完成处理程序称为导出是失败,完成还是被取消。完成后,该属性指示导出是否成功完成。如果失败,则该属性的值将提供有关失败原因的其他信息。
insertTimeRange(_:of:at:)
将指定资产在给定时间范围内的所有轨道插入接收器。
func insertTimeRange(_ timeRange: CMTimeRange,
of asset: AVAsset,
at startTime: CMTime) throws
参量
timeRange
要插入的资产的时间范围。asset
包含要插入的曲目的资产。startTime
接收方应显示插入的曲目的时间。outError
如果插入不成功,则返回一个包含NSError描述问题的对象。
返回值
true如果插入成功,否则false。
讨论区
此方法可以添加新轨道,以确保资产的所有轨道都在插入的时间范围内表示。在指定的开始时间的现有内容将在该时间范围的持续时间内推出。插入时间范围内的媒体数据以其自然持续时间显示;您可以使用缩放到不同的持续时间。scaleTimeRange(_:toDuration:)
在Swift中处理错误:在Swift中,此方法返回Void并标记有throws关键字,以指示在失败的情况下抛出错误。你叫的这种方法try表达,并在处理任何错误catch一的条款do声明,如在错误处理中的斯威夫特程序设计语言和关于进口可可错误参数。