AVAsset 与 Composition
检查并组合媒体轨道。
AVAsset 与 Composition 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
AVAsset 表示媒体
AVAsset 对一段有时间属性的媒体进行建模,包括其 tracks、duration 和元数据,而不负责具体播放。它是编辑功能的基础。
import AVFoundation
let asset = AVURLAsset(url: fileURL)异步加载属性
Asset 的属性会延迟加载。请使用异步 load(_:) API 获取 duration 或 tracks,而不会阻塞程序。
let duration = try await asset.load(.duration)
let tracks = try await asset.load(.tracks)Tracks
一个 asset 包含多个 AVAssetTrack,每个 track 携带一种媒体类型,例如视频、音频或字幕。编辑时,您可以检查并重用这些 tracks。
let videoTracks = try await asset.loadTracks(withMediaType: .video)
let audioTracks = try await asset.loadTracks(withMediaType: .audio)AVMutableComposition
AVMutableComposition 是一个可编辑的 asset,您可以通过插入其他 asset 的时间范围来构建它,这是剪辑和拼接的核心。
let composition = AVMutableComposition()添加 composition tracks
为每种媒体类型创建一个可变 track,并指定其类型和 track ID。
let videoTrack = composition.addMutableTrack(
withMediaType: .video,
preferredTrackID: kCMPersistentTrackID_Invalid)插入时间范围
使用 insertTimeRange 将源 track 的一段内容复制到 composition track 中,并选择它在时间线上的位置。
let range = CMTimeRange(start: .zero, duration: try await asset.load(.duration))
try videoTrack?.insertTimeRange(range, of: sourceTrack, at: .zero)裁剪剪辑片段
通过指定子范围(起点和较短的 duration)只插入源内容的一部分,即可完成裁剪。
let clip = CMTimeRange(
start: CMTime(seconds: 5, preferredTimescale: 600),
duration: CMTime(seconds: 10, preferredTimescale: 600))
try videoTrack?.insertTimeRange(clip, of: sourceTrack, at: .zero)拼接多个剪辑片段
将每个剪辑片段插入当前 composition duration 的位置,使它们首尾相接,从而构建一条连续的时间线。
var cursor = CMTime.zero
for src in sourceTracks {
let r = CMTimeRange(start: .zero, duration: src.timeRange.duration)
try videoTrack?.insertTimeRange(r, of: src, at: cursor)
cursor = cursor + r.duration
}用于效果处理的视频 composition
如需实现变换、分层或转场,请将 composition 与 AVMutableVideoComposition 配合使用,后者用于定义各个时间范围的指令。
let videoComposition = AVMutableVideoComposition()
videoComposition.frameDuration = CMTime(value: 1, timescale: 30)导出结果
使用 AVAssetExportSession 将 composition 渲染到文件中,并选择预设和输出 URL。
let export = AVAssetExportSession(
asset: composition, presetName: AVAssetExportPresetHighestQuality)
export?.outputURL = outputURL
export?.outputFileType = .mp4
await export?.export()导出前预览
由于 composition 本身就是一个 AVAsset,因此您可以将它包装在 AVPlayerItem 中,在正式导出前预览编辑结果。
let previewItem = AVPlayerItem(asset: composition)
let player = AVPlayer(playerItem: previewItem)快速检查:composition
请检验您对 AVAsset 和 composition 的理解。
回顾:AVAsset 与 composition
AVAsset 对媒体进行建模,包括 tracks、duration 和元数据,并支持异步加载属性。AVMutableComposition 通过从源 tracks 中插入时间范围来构建可编辑的时间线,从而实现裁剪和拼接。
添加 AVMutableVideoComposition 以实现效果,将 composition 包装在 AVPlayerItem 中进行预览,并使用 AVAssetExportSession 进行渲染。
常见问题解答
「AVAsset 与 Composition」课时是免费的吗?
是的 — 「AVAsset 与 Composition」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「AVAsset 与 Composition」这节课中我会学到什么?
检查并组合媒体轨道。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「AVAsset 与 Composition」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 AVPlayer 播放媒体
- 录制音频
- AVAsset 与 Composition
- 在 SwiftUI 中嵌入播放器