使用 AVPlayer 播放媒体
流式传输并播放音频和视频资源。
使用 AVPlayer 播放媒体 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
使用 AVFoundation 处理媒体
AVFoundation 是 Apple 用于处理基于时间的视听媒体的框架,支持播放、采集、编辑和导出。
核心播放类是 AVPlayer。
import AVFoundationAVPlayer 与 AVPlayerItem
AVPlayer 控制播放,AVPlayerItem 表示正在播放的媒体并跟踪其状态。该 item 由一个 AVAsset 提供基础数据。
let url = URL(string: "https://example.com/video.mp4")!
let item = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: item)开始与暂停
使用 play()、pause() 和 seek(to:) 控制播放。播放会从当前时间开始。
player.play()
// later
player.pause()显示视频
要在 UIKit 中显示视频,请将 AVPlayerLayer 放入视图中。该图层会渲染播放器的画面输出。
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
playerLayer.videoGravity = .resizeAspect
view.layer.addSublayer(playerLayer)观察状态
AVPlayerItem 会报告一个 status。观察它可以得知媒体何时 readyToPlay 或已经 failed。
let observation = item.observe(\.status) { item, _ in
if item.status == .readyToPlay {
player.play()
}
}跟踪时间
使用 addPeriodicTimeObserver,随着播放进度推进更新进度界面。时间使用 CMTime 值表示。
let interval = CMTime(seconds: 0.5, preferredTimescale: 600)
player.addPeriodicTimeObserver(forInterval: interval, queue: .main) { time in
let seconds = time.seconds
print("at \(seconds)s")
}CMTime 基础
CMTime 将时间存储为有理数(value 除以 timescale),从而实现样本级的精确度。600 的 timescale 可以整除常见的帧率。
let t = CMTime(seconds: 5, preferredTimescale: 600)
let half = CMTimeMultiplyByFloat64(t, multiplier: 0.5)精确跳转
使用零容差调用 seek(to:toleranceBefore:toleranceAfter:) 可以实现帧级精确的跳转,但会增加解码工作量。
let target = CMTime(seconds: 30, preferredTimescale: 600)
player.seek(to: target, toleranceBefore: .zero, toleranceAfter: .zero)到达结尾
观察 AVPlayerItem.didPlayToEndTimeNotification 来检测播放完成,然后可以循环播放、关闭当前内容或显示下一个 item。
NotificationCenter.default.addObserver(
forName: .AVPlayerItemDidPlayToEndTime,
object: item, queue: .main) { _ in
player.seek(to: .zero)
player.play() // loop
}用于播放的音频会话
如需正确播放音频(并在配置后支持后台继续播放),请使用合适的类别设置 AVAudioSession。
let session = AVAudioSession.sharedInstance()
try? session.setCategory(.playback)
try? session.setActive(true)使用 AVQueuePlayer 播放列表
AVQueuePlayer 继承自 AVPlayer,可以按顺序播放队列中的多个 item,非常适合播放列表和连续视频流。
let queue = AVQueuePlayer(items: [item1, item2, item3])
queue.play()快速检查:AVPlayer
请检验您对 AVPlayer 播放功能的理解。
回顾:使用 AVPlayer 播放媒体
AVPlayer 驱动由 AVAsset 提供基础数据的 AVPlayerItem 进行播放,AVPlayerLayer 负责渲染视频。请观察 item 的 status,使用定期的 CMTime 观察者跟踪进度,使用零容差进行精确跳转,并处理播放结束通知。
配置 AVAudioSession 以确保音频正常播放,并使用 AVQueuePlayer 播放列表。
常见问题解答
「使用 AVPlayer 播放媒体」课时是免费的吗?
是的 — 「使用 AVPlayer 播放媒体」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 AVPlayer 播放媒体」这节课中我会学到什么?
流式传输并播放音频和视频资源。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 AVPlayer 播放媒体」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 AVPlayer 播放媒体
- 录制音频
- AVAsset 与 Composition
- 在 SwiftUI 中嵌入播放器