簡體   English   中英

使用 AVPlayer - swift - 以編程方式顯示多個視頻

[英]Display multiple videos with AVPlayer - swift - programmatically

我有一個 AVPlayer 顯示來自 url 的視頻,這是我的設置方式:

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:

這是我創建的兩個片段,用於顯示來自 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 列表播放視頻嗎?

以下演示將播放一系列視頻網址,向前和向后。 不幸的是,我無法讓它在 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM