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