ios - AVPictureInPictureController 在后台应用程序时不会自动启动画中画
问题描述
使用 ++ 为运行 iOS 14(beta 7)的 iPhone 创建自定义视频播放器AVPlayer
时AVPlayerLayer
,当应用程序在从 UIButton 操作调用AVPictureInPictureController
后进入后台时,视频不会自动进入画中画模式。player.start()
AVPlayerViewController
使用似乎表明 iOS 14 存在问题的问题无法重现AVPictureInPictureController
,但我想知道是否有其他人遇到此问题并知道任何解决方法。我还向 Apple 提交了这个问题rdar://8620271
示例代码。
import UIKit
import AVFoundation
import AVKit
class ViewController: UIViewController {
private let player = AVPlayer(url: URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")!)
private var pictureInPictureController: AVPictureInPictureController!
private var playerView: PlayerView!
private var playButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
playerView = PlayerView(frame: CGRect(x: 0, y: 44, width: view.bounds.width, height: 200))
playerView.backgroundColor = .black
playerView.playerLayer.player = player
view.addSubview(playerView)
playButton = UIButton(frame: CGRect(x: view.bounds.midX - 50, y: playerView.frame.maxY + 20, width: 100, height: 22))
playButton.setTitleColor(.blue, for: .normal)
playButton.setTitle("Play", for: .normal)
playButton.addTarget(self, action: #selector(play), for: .touchUpInside)
view.addSubview(playButton)
pictureInPictureController = AVPictureInPictureController(playerLayer: playerView.playerLayer)
do {
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playback)
try audioSession.setMode(.moviePlayback)
try audioSession.setActive(true)
} catch let e {
print(e.localizedDescription)
}
}
@objc func play() {
player.play()
}
}
class PlayerView: UIView {
override class var layerClass: AnyClass {
return AVPlayerLayer.self
}
var playerLayer: AVPlayerLayer! {
return layer as? AVPlayerLayer
}
}
解决方案
问题的根本原因最终是双重的:
AVAudioSession.sharedInstance().setActive(true)
必须在初始化之前调用。AVPictureInPictureController
的帧大小
AVPlayerLayer
必须具有不大于 16/9 的纵横比(作为单独的错误归档,rdar//8689203
)对于 iPad,视频必须与设备的宽度相同(在任何给定方向上)。没有单独的 rdar,因为 Apple 已经承认了另一个错误。
(上面的示例中不存在第二个问题)
Apple 已经承认了这些错误,并向我报告他们已经/将要修复(雷达实际上导致回复的罕见情况!)
推荐阅读
- go - 这是基于消息总线的发布-订阅模式吗?
- vba - 尝试删除 TOC 中的字符会删除整个 TOC 行
- winapi - Loadbitmap 在 x86 上编译和运行良好,但在编译为 x64 时无法正常工作
- magento2 - 无法访问 Magento 2 中的管理员 URL
- python-3.x - Python for循环仅将最后一个值保存到csv?
- translation - 支持 Santali 语言的 XLIFF 编辑器?
- flutter - 将网络图像上传到 Firestore
- python - how can I balance these brackets in this recursive function?
- php - 了解 Elasticsearch 配置文件 API 输出
- apache-spark - 无法在 Apache Spark 中保存模型——Py4JJavaError