1 ios avplayer avplayerviewcontroller swiftui uiviewrepresentable
因此,我创建了一个名为“VideoElement”的视图,当父视图加载时,它将在后台播放视频。效果很好。但是,我不知道如何实现暂停/恢复系统。我想更改一个变量(var“paused”),该变量在 true 时暂停视频,在 false 时恢复播放。这有点管用。具体来说,当“暂停”为真时,视频暂停。但是,当它变为 false 时,视频不会恢复播放。
也许它可能与“updateUIViewController”有关?另外,我不知道为什么“暂停”必须是绑定变量而不是状态变量(@State 不起作用)。任何帮助将不胜感激。谢谢!
import SwiftUI
import AVKit
struct VideoElement: View {
var fileName: String
@Binding var paused: Bool //this controls playback
var body: some View {
let player = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forAuxiliaryExecutable: fileName)!))
AVPlayerControllerRepresented(player: player)
.onAppear {
player.play()
}
.onChange(of: paused, perform: { paused in
if paused {
player.pause()
}
else {
player.play() //should play the video, does not
print("resume") //this runs, so above should've run also
}
})
}
}
}
struct AVPlayerControllerRepresented : UIViewControllerRepresentable {
var player : AVPlayer
func makeUIViewController(context: Context) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = player
controller.showsPlaybackControls = false
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
}
}
Run Code Online (Sandbox Code Playgroud)
我不建议AVPlayer在 - 中创建body- 这将保证任何时候重新渲染视图时,都会重新创建播放器。相反,请将其存储在能够重新渲染后继续存在的位置。我ObservableObject为此选择了一个。
class PlayerManager : ObservableObject {
let player = AVPlayer(url: URL(string: "https://media.w3.org/2010/05/sintel/trailer.mp4")!)
@Published private var playing = false
func play() {
player.play()
playing = true
}
func playPause() {
if playing {
player.pause()
} else {
player.play()
}
playing.toggle()
}
}
struct ContentView: View {
@StateObject var playerManager = PlayerManager()
var body: some View {
VStack {
AVPlayerControllerRepresented(player: playerManager.player)
.onAppear {
playerManager.play()
}
Button("Play/Pause") {
playerManager.playPause()
}
}
}
}
struct AVPlayerControllerRepresented : UIViewControllerRepresentable {
var player : AVPlayer
func makeUIViewController(context: Context) -> AVPlayerViewController {
let controller = AVPlayerViewController()
controller.player = player
controller.showsPlaybackControls = false
return controller
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5375 次 |
| 最近记录: |