在iOS開發視頻播放畫中畫(PiP)最簡單的方法是使用AVPlayerViewController
實現現標準播放器,實際上使用AVPlayerViewController
播放器時將自動支持畫中畫(PiP)功能。
實現代碼
- 配置Audio Playback Behavior,需要設置App 的AVAudioSession的Category為playback模式
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .moviePlayback, options: [])
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print("無法設置音頻會話類別: \(error)")
}
import UIKit
import AVKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .black
}
func initPlayer() {
let _videoURL = "***播放地址***"
let _player = AVPlayer(url:_videoURL)
let _playerVC = AVPlayerViewController()
_playerVC.delegate = self
if AVPictureInPictureController.isPictureInPictureSupported() {
_playerVC.allowsPictureInPicturePlayback = true
if #available(iOS 14.2, *) {
_playerVC.canStartPictureInPictureAutomaticallyFromInline = true
}
}
_playerVC.player = _player
self.present(playerViewController, animated: true) {
_player.play()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.initPlayer()
}
}
PiP代理方法
// 通知代理 AVPlayerViewController 即將開始全屏顯示其內容
func playerViewController(_ playerViewController: AVPlayerViewController, willBeginFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
print("")
}
// 通知代理 AVPlayerViewController 將停止全屏顯示其內容
func playerViewController(_ playerViewController: AVPlayerViewController, willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {
print("")
}
// 即將啟動畫中畫(Picture in Picture, PiP)模式時調用此方法
// 可以在此方法中設置或更新一些相關的 UI 元素或狀態,以反映視頻即將進入畫中畫模式。
func playerViewControllerWillStartPictureInPicture(_ playerViewController: AVPlayerViewController) {
print("")
}
// 已經進入畫中畫模式時調用此方法
// 用法:用于更新 UI 或進行其他準備工作,以支持畫中畫模式。
func playerViewControllerDidStartPictureInPicture(_ playerViewController: AVPlayerViewController) {
print("")
}
// 當畫中畫模式啟動失敗時調用此方法
// 用法:處理畫中畫模式啟動失敗時的錯誤。
func playerViewController(_ playerViewController: AVPlayerViewController, failedToStartPictureInPictureWithError error: Error) {
print("")
}
// 即將結束畫中畫模式時調用此方法
// 用法:在視頻退出畫中畫模式前進行收尾工作,更新 UI 或做一些清理
func playerViewControllerWillStopPictureInPicture(_ playerViewController: AVPlayerViewController) {
print("")
}
// 已經結束畫中畫模式時調用此方法
// 用法:用于恢復正常播放狀態,或者處理畫中畫模式結束后的邏輯
func playerViewControllerDidStopPictureInPicture(_ playerViewController: AVPlayerViewController) {
print("PiPVC:playerViewControllerDidStopPictureInPicture")
}
// 返回 true 或 false,指示在啟動畫中畫時播放器是否應自動關閉。
// 用法:如果希望在進入畫中畫模式時關閉 AVPlayerViewController,則返回 true,否則返回 false。
func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_ playerViewController: AVPlayerViewController) -> Bool {
return true
}
// 當畫中畫模式結束時,恢復用戶界面。如果 AVPlayerViewController 在啟動畫中畫后關閉,該方法可用于恢復 UI。
// 用法:用于確保在結束畫中畫后,用戶界面恢復到正確的狀態。確保調用 completionHandler 來表示恢復工作已經完成。
func playerViewController(_ playerViewController: AVPlayerViewController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) {
completionHandler(true)
}
PS1:從iOS 14開始,畫中畫用戶界面提供了允許用戶在視頻中向前和向后跳轉的控件。默認情況下,系統為iOS14或更高版本中鏈接的應用程序啟用這些控件。如果您需要限制跳過內容以獲得法律免責聲明或廣告,請在視頻的所需部分使用requiresLinearPlayback。一旦您可以再次允許seek,請將此屬性設置為false。
PS2:當用戶在播放器界面中選擇PiP按鈕時,PiP播放開始。在iOS和iPadOS中,如果您的視頻以全屏模式播放,并且用戶退出應用程序,則PiP播放會自動開始。當視頻的寬度沒有填滿整個屏幕時,請使用canStartPictureInPictureAutomaticyFromInline來指示視頻是主要焦點。在任何一種情況下,播放器窗口都會最小化為可移動的浮動窗口。
通常情況下,系統會自動暫停視頻的場景下,因此您不需要根據激活狀態暫停視頻。