微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 视频播放器 - 如何获取当前时间?

如何解决SwiftUI 视频播放器 - 如何获取当前时间?

我在让视频播放器在 swiftUI 中工作时遇到了噩梦,我可以轻松获取视频时间戳、隐藏视频控件并轻松播放/暂停视频。

如果你愿意,可以阅读,但我在下面稍微编辑了这篇文章为了解决这个问题,我尝试在 AVFoundation 中实现我自己的视频播放器,然后在 SwiftUI 视图中显示它,但是,代码一团糟,我真的不明白。使用难,实施也难。为了查看我的努力,我在这里链接一个游乐场: Playground Project Download Here for MacOS 然而,由于这个项目已经变得如此混乱,我希望有人可以解释/展示如何:

  1. 从 URL 创建视频播放器 - 本地/外部。
  2. 根据时间戳播放/暂停视频。
  3. 隐藏控件

这是我为显示视频而编写的其他一些代码

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()

但我不确定如何将其实现到上面的代码中。其来自:here

编辑: 我试图在 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 举报,一经查实,本站将立刻删除。