以下演示将播放一系列视频网址,向前和向后。不幸的是,我无法让它在 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()