问题描述
我在让视频播放器在 swiftUI 中工作时遇到了噩梦,我可以轻松获取视频时间戳、隐藏视频控件并轻松播放/暂停视频。
如果你愿意,可以阅读,但我在下面稍微编辑了这篇文章: 为了解决这个问题,我尝试在 AVFoundation 中实现我自己的视频播放器,然后在 SwiftUI 视图中显示它,但是,代码一团糟,我真的不明白。使用难,实施也难。为了查看我的努力,我在这里链接了一个游乐场: Playground Project Download Here for MacOS 然而,由于这个项目已经变得如此混乱,我希望有人可以解释/展示如何:
- 从 URL 创建视频播放器 - 本地/外部。
- 根据时间戳播放/暂停视频。
- 隐藏控件
import SwiftUI
import AVKit
struct VideoView: View {
private let player = AVPlayer(url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!)
var body: some View {
VideoPlayer(player: player)
.onAppear() {
// Start the player going,otherwise controls don't appear
player.play()
}
.ondisappear() {
// Stop the player when the view disappears
player.pause()
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
VideoView()
}
}
为了移除控件,我在 VideoPlayer 上添加了修饰符 .disabled(true)
,但它仍然在前几秒钟显示,这不是噩梦,但如果它根本不显示就好了。但无法根据时间戳播放/暂停视频。
即。如果视频是 1 分钟,则暂停等...
我在网上发现你可以这样做:
let currentPlayer = AVPlayer()
if let currentItem = currentPlayer.currentItem {
let duration = currentItem.asset.duration
}
let currentTime = currentPlayer.currentTime()
编辑: 我试图在 MacOS 的操场上像这样实现它:
import SwiftUI
import PlaygroundSupport
import AVKit
struct VideoView: View {
private let player = AVPlayer(url: URL(string: "https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8")!)
var body: some View {
VideoPlayer(player: player)
.onAppear() {
// Start the player going,otherwise controls don't appear
player.play()
}
.ondisappear() {
// Stop the player when the view disappears
player.pause()
}
.onChange(of: player.currentTime(),perform: { value in
if let currentItem = player.currentItem {
let duration = currentItem.asset.duration
}
let currentTime = player.currentTime()
print (cmTimetoSeconds(currentTime))
})
//.disabled(true)
}
}
func cmTimetoSeconds(_ time: CMTime) -> TimeInterval? {
let seconds = CMTimeGetSeconds(time)
if seconds.isNaN {
return nil
}
return TimeInterval(seconds)
}
PlaygroundPage.current.setLiveView(VideoView())
但是 onChange
仍然没有打印出当前时间?这是为什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)