(一)深入了解AVFoundation:框架概述与核心模块解析-CSDN博客 |
(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门-CSDN博客 |
(三)深入了解AVFoundation-播放:AVPlayer 进阶 播放状态 & 进度监听全解析_监听 avplayer 播放的进度,结束,等状态变化-CSDN博客 |
(四)深入理解AVFoundation-播放:高度自定义视频播放器 UI-CSDN博客 |
(五)深入了解AVFoundation-播放:多音轨、字幕、倍速播放与横竖屏切换-CSDN博客 |
(六)深入了解AVFoundation-播放:AirPlay、画中画后台播放-CSDN博客 |
AVFoundation 是 Apple 提供的强大多媒体框架,支持音视频播放、录制、处理等功能。在 iOS 开发中,AVFoundation 是实现视频播放的核心技术之一。
本篇文章将简单介绍如何使用 AVPlayer、AVPlayerItem 和 AVPlayerLayer 进行视频播放,并讲解如何控制播放的开始、暂停、以及控制播放进度,逐步来熟悉框架。
在使用 AVFoundation 进行视频播放时,会涉及到以下几个核心的类:
下面我们再一一详细的来讲述一下每个类的作用及用法。
AVAsset 代表一个媒体资源,可以是本地文件、远程资源地址或者其他格式的媒体资源。它的主要特点是可以屏蔽底层资源的类型,使开发者可以通过统一的方式来处理不同来源、不同类型的媒体资源。
AVAsset 本身是一个抽象类,并不能直接播放,需要通过 AVPlayerItem 进行包装。
AVAsset提供了丰富的属性和方法,例如:
示例代码:
guard let path = Bundle.main.path(forResource: "test", ofType: "mp4") else {
return
}
let url = URL(fileURLWithPath: path)
let asset = AVAsset(url: url)
// 异步加载asset时长信息
asset.loadValuesAsynchronously(forKeys: ["duration"]) {
var error: NSError?
let status = asset.statusOfValue(forKey: "duration", error: &error)
if status == .loaded {
let duration = asset.duration
print("duration: \(CMTimeGetSeconds(duration))")
}
}
在 iOS 16 之后推荐使用:
Task {
do {
let duration = try await loadDuration(asset: asset)
print("duration: \(CMTimeGetSeconds(duration))")
} catch {
print("Failed to load duration: \(error)")
}
}
AVPlayerItem 代表的是一个具体的视频资源,AVPlayer 需要依赖 AVPlayerItem 才能进行播放。
AVPlayerItem 的作用包括:
示例代码:
/// 监听状态keypath
let kStatusKeyPath = "status"
/// 监听标识
var playerItemContext = 0
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
AVPlayer 是核心播放器类,负责管理视频的播放状态。它通过加载 AVPlayerItem 进行资源的播放,并提供播放、暂停、调整播放进度等功能。
AVPlayer 还对我提供了播放进度监听的机制,以及播放状态的监听属性包括.playing、.paused、.waitingToPlayAtSpecifiedRate。
常见的方法:
示例代码:
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
// 播放
player.play()
// 暂停
player.pause()
// 快进到指定时间
player.seek(to: CMTime(seconds: 1, preferredTimescale: 1))
AVPlayerLayer 是 AVFoundation 提供的 CALayer的子类,专门用来渲染 AVPlayer 的播放的视频内容,我们可以直接将它添加到UIView上,或者通过重写UIView的图层属性、以显示画面。
示例代码:
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
AVAsset ——> AVPlayerItem ——> AVPlayer ——> AVPlayerLayer
(资源) (封装) (控制播放) (渲染画面)
在进行视频播放时,首先需要获取视频文件的 URL,并使用该 URL 创建一个 AVAsset 媒体资源对象。然后,基于 AVAsset 创建 AVPlayerItem 视频播放资源,最后通过 AVPlayer 来控制和播放视频。
播放本地视频:
// 加载视频
guard let path = Bundle.main.path(forResource: "test", ofType: "mp4") else {
return
}
let url = URL(fileURLWithPath: path)
let asset = AVAsset(url: url)
// 创建视频资源
let playerItem = AVPlayerItem(asset: asset)
// 创建播放器
let player = AVPlayer(playerItem: playerItem)
player.play()
// 创建播放器图层
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = view.bounds
view.layer.addSublayer(playerLayer)
而对于网络资源而言,我们之间通过远程地址创建url即可。
视频的播放控制包括了视频的播放、暂停、以及拖动进度,这些全部由播放器AVPlayer来完成。
调用AVPlayer的play()方法。
player.play()
调用AVPlayer提供的pause()方法。
player.pause()
或者设置player的播放速度为0.0。
player.rate = 0.0
player提供了seek(to:)方法,可以让我们随意指定播放位置。
// 跳转到 10 秒位置
let time = CMTime(seconds: 10, preferredTimescale: 1)
player.seek(to: time)
本篇文章介绍了如何使用 AVFoundation 进行视频播放,包括核心类的解析、本地与网络视频播放示例,以及播放控制功能。AVFoundation 提供了丰富的 API,开发者可以基于这些基础功能进一步拓展,如添加播放进度监听、全屏播放、倍速播放等功能,打造更完善的播放器体验。