swift - 使用 AVPlayer - 快速 - 以编程方式显示多个视频

标签 swift url avplayer avplayerlayer

我有一个 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:

这是我创建的两个片段,用于显示网址数组中的视频列表:

 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 从网址列表中播放视频吗?

最佳答案

以下演示将播放一系列视频网址(向前和向后)。不幸的是,我无法让它在 Xcode 中运行:“错误 = AudioObjectRemovePropertyListenerBlock:无法删除 NULL 监听器过程”,我不知道如何解决该问题。但是使用终端运行正常。您需要添加自己的文件路径以转换为网址(或添加视频网址)。将代码复制/粘贴到名为“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()

关于swift - 使用 AVPlayer - 快速 - 以编程方式显示多个视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64271277/

相关文章:

ios - [CLLocationCoordinate2d]?没有名为下标的成员

swift - 在 swift 中单击时更新行的属性

iOS:AVPlayer - 获取视频当前帧的快照

ios - 如何在 AVPlayer 中强制横向模式?

iphone - 使用 AVFoundation 播放视频时遇到问题

ios - SetSDK 如何在用户离开家时得到通知?

ios - 允许用户在 if 语句中选择 Player Skin Found nil

java - 如何创建持久的 https 连接

php - 用 PHP 检查 URL 是否有特定的字符串

python - 如何使用 Flask 处理服务器接收到的客户端路由?