ios - 如何以正确的方式在 SwiftUI 中实现 AVPlayer?
问题描述
我在播放器方面遇到了一些问题。我知道有很多播放器示例,但几乎所有播放器示例都设计为仅播放一个 url,并且没有我想要的功能。
首先这是我现有的播放器代码:
struct PlayerViewController: UIViewControllerRepresentable {
var video: Video
private let player = AVPlayer()
func makeUIViewController(context: Context) -> AVPlayerViewController {
let playerVC = AVPlayerViewController()
playerVC.player = self.player
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
} catch(let error) {
print(error.localizedDescription)
}
playerVC.player?.play()
return playerVC
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
guard let url = URL(string: video.url) else { return }
resetPlayer(uiViewController)
let item = AVPlayerItem(url: url)
uiViewController.player?.replaceCurrentItem(with: item)
uiViewController.player?.play()
if((uiViewController.view.window) == nil)
{
uiViewController.player?.pause()
}
print("Player::UpdatePlayer: Player updated")
}
func resetPlayer(_ vc: AVPlayerViewController) {
vc.player?.pause()
vc.player?.replaceCurrentItem(with: nil)
print("Player::ResetPlayer: Player reseted.!")
}
}
struct Video: Identifiable, Equatable {
var id: Int
var url: String
}
我使用它如下。这只是我在实际项目中用按钮操作替换 str 的示例。
struct TestTestView: View {
@State var str: String = ""
var body: some View {
PlayerViewController(video: Video(id: 2, url: (str == "") ? chan.getDVR()[0].getHlsStreamURL() : self.str ))
}
}
现在上面的代码可以工作到一定程度。它会播放,您可以通过单击按钮来更新 url,它会播放新的 url。但是当它进入全屏时,视频会停止,因为它会更新整个播放器,尽管没有任何改变。以下几行使其在进入全屏模式时暂停:
if((uiViewController.view.window) == nil)
{
uiViewController.player?.pause()
}
但是,如果我在导航到另一个屏幕时删除这些行,它会继续播放,你会一直听到声音。我试图检测全屏来更新我的代码,但我无法做到。我试图检测到播放器实际上在屏幕上,但效果不佳。那么实现它的正确方法是什么。基本上我想做:
1 - 能够更新播放器并播放不同的流 2 - 开始自动播放 3 - 切换到全屏模式时平稳地继续播放 4 - 导航到另一个屏幕时停止。
顺便说一句,如果它不是全屏模式,我无法单击播放按钮或进度条,但不知何故我可以单击静音或全屏按钮。我需要帮助!!
解决方案
推荐阅读
- jquery - jQuery - 如何避免切词 - 阅读更多
- python - TensorFlow 看不到 GPU 设备
- javascript - JS - 收集一个字符之间的所有字母 (:)
- series - 根据 Maple 中 Series 命令的结果定义函数
- ios - 登录后如何滚动到顶部?
- postgresql - postgres密码认证失败的未知原因
- linux - 如何使用linux为特定列中的每个元素添加一个新数字
- python - 获取两个坐标之间的距离时出错
- uitableview - JavaFX - 使用自定义文本字段表格单元格删除表格视图中的行
- ember-data - 无法获取 JSONAPI 关系来填充嵌套模型的 ember 数据