【问题标题】:Display multiple videos with AVPlayer - swift - programmatically使用 AVPlayer 显示多个视频 - 快速 - 以编程方式
【发布时间】:2020-10-08 22:05:44
【问题描述】:

我有一个显示来自 url 的视频的 AVPlayer,我是这样设置的:

fileprivate func setUpPlayer(cardModel : CardModel){
    
    cardModel.urlStrings?.forEach({ (urlstring) in
        
        guard let url = URL(string: urlstring) else {
            return
        }
        
        urlStrings.append(url)
    })
    
    player = AVPlayer(url: urlStrings[0])
    playerLayer = AVPlayerLayer(player: player)
    playerLayer.videoGravity = .resizeAspectFill
    player.play()
    self.playerView.layer.insertSublayer(playerLayer, at: 0).
    }
  

正如您在开头看到的那样,我创建了一个 url 列表,我想在触摸事件发生时显示这个 url:

这是我创建的两个 sn-ps,用于显示来自 url 数组的视频列表:

 fileprivate func goToNextVideo(){
    counter = counter + 1
    counter = min(counter, cardModel!.urlStrings!.count - 1)
    
   
    player = AVPlayer(url: urlStrings[counter])
    
    playerLayer = AVPlayerLayer(player: player)
    playerLayer.videoGravity = .resizeAspectFill
    player.play()
}



fileprivate func goToPreviousVideo(){
    counter = counter - 1
    counter = max(0, counter)
   
    player = AVPlayer(url: urlStrings[counter])
    playerLayer = AVPlayerLayer(player: player)
    playerLayer.videoGravity = .resizeAspectFill
    player.play()
}

这个实现似乎不起作用,当我转到下一个视频时,我只能听到音频但看不到视频,你知道如何使用 AVPlayer 从 url 列表中播放视频吗?

【问题讨论】:

    标签: swift url avplayer avplayerlayer


    【解决方案1】:

    以下演示将播放一系列视频网址,向前和向后。不幸的是,我无法让它在 Xcode 中运行:'error = AudioObjectRemovePropertyListenerBlock: can't remove a NULL listener proc',我不知道如何解决这个问题。但是它使用终端运行正常。您需要添加自己的文件路径以转换为 url(或添加视频 url)。将代码复制/粘贴到名为“videoPlayer.swift”的文件中,然后在终端中使用下面显示的命令行代码。

    /*
    1. Add paths to video urls array
    2. To run in Terminal:
    swiftc videoPlayer.swift -framework Cocoa -o videoPlayer && ./videoPlayer
    */
    
    import Cocoa
    import AVKit
    import AVFoundation
    
    var videos = [URL]() // video url array
    var count:Int = 3 // Starts on videos[3]
    
    class AppDelegate: NSObject, NSApplicationDelegate {
    var window:NSWindow!
    var playerView:AVPlayerView!
    
    @objc func playAction(_ sender:AnyObject ) {
       let player = AVPlayer(url:videos[count])
        playerView.player = player
        player.play()
        window.setTitleWithRepresentedFilename(videos[4].lastPathComponent)
      print("index = \(count)")
    }
    
    @objc func forwardAction(_ sender:AnyObject ) {
     if (count == videos.count - 1) {
      count = 0
     } else {
      count = count + 1
     }
     print("index = \(count)")     
     let player = AVPlayer(url: videos[count]) 
     playerView.player = player   
     player.play()
     window.setTitleWithRepresentedFilename(videos[count].lastPathComponent) 
     }
    
    @objc func backAction(_ sender:AnyObject ) {
    if (count == 0) {
      count = videos.count - 1
     } else {
     count = count - 1
     }
     print("index = \(count)")
     let player = AVPlayer(url: videos[count]) 
     playerView.player = player   
     player.play()
     window.setTitleWithRepresentedFilename(videos[count].lastPathComponent)
     
    }
    
    func loadPlayList() {
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo0.m4v"))
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo1.m4v"))
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo2.mp4"))
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo3.mp4"))
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo4.m4v"))
    videos.append(URL(fileURLWithPath:"/Users/xxxx/Movies/myVideo5.mpg"))
    
     for video in videos {
      print(video)
     }
     print("total videos = \(videos.count)")
    }
    
    func buildMenu() {
     let mainMenu = NSMenu()
     NSApp.mainMenu = mainMenu
     // **** App menu **** //
     let appMenuItem = NSMenuItem()
     mainMenu.addItem(appMenuItem)
     let appMenu = NSMenu()
     appMenuItem.submenu = appMenu
     appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q") 
    }
        
    func buildWnd() {
        
    let _wndW : CGFloat = 500
    let _wndH : CGFloat = 400
    
     window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .closable, .miniaturizable, .resizable], backing:.buffered, defer:false)
     window.center()
     window.title = "AVPlayer"
     window.makeKeyAndOrderFront(window)
    
    // **** AVPlayerView **** //
    playerView = AVPlayerView(frame:NSMakeRect( 0, 60, _wndW, _wndH - 60))
    playerView.autoresizingMask = [.width, .height]
    window.contentView!.addSubview (playerView)
    
    // **** Play Button **** //
    let playBtn = NSButton (frame:NSMakeRect( 155, 10, 95, 24 ))
     playBtn.bezelStyle = .rounded
     playBtn.autoresizingMask = [.maxXMargin,.maxYMargin]
     playBtn.title = "Play"
     playBtn.action = #selector(self.playAction(_:))
     window.contentView!.addSubview (playBtn)
    
    // **** Forward Button **** //
    let forwardBtn = NSButton (frame:NSMakeRect( 260, 10, 65, 24 ))
     forwardBtn.bezelStyle = .rounded
     forwardBtn.autoresizingMask = [.maxXMargin,.maxYMargin]
     forwardBtn.title = "Fwd"
     forwardBtn.action = #selector(self.forwardAction(_:))
     window.contentView!.addSubview (forwardBtn)
    
    // **** Backward Button **** //
    let backBtn = NSButton (frame:NSMakeRect( 330, 10, 65, 24 ))
     backBtn.bezelStyle = .rounded
     backBtn.autoresizingMask = [.maxXMargin,.maxYMargin]
     backBtn.title = "Back"
     backBtn.action = #selector(self.backAction(_:))
     window.contentView!.addSubview (backBtn)
    
    // **** Quit btn **** //
    let quitBtn = NSButton (frame:NSMakeRect( _wndW - 50, 10, 40, 40 ))
     quitBtn.bezelStyle = .circular
     quitBtn.autoresizingMask = [.minXMargin,.maxYMargin]
     quitBtn.title = "Q"
     quitBtn.action = #selector(NSApplication.terminate)
     window.contentView!.addSubview(quitBtn)
    }
     
    func applicationDidFinishLaunching(_ notification: Notification) {
     buildMenu()
     buildWnd()
     loadPlayList() 
    }
    
    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
     return true
    }
    
    }
    let appDelegate = AppDelegate()
    
    // **** main.swift **** //
    let app = NSApplication.shared
    app.delegate = appDelegate
    app.setActivationPolicy(.regular)
    app.activate(ignoringOtherApps:true)
    app.run()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多