如何在 Xcode macOS Cocoa 应用程序中嵌入和流式传输来自网络的视频?
How to embed and stream a video from the web within an Xcode macOS Cocoa Application?
我正在尝试让我的 macOS Cocoa 应用程序 Xcode 项目在我为它提供指定的 URL 时播放一些视频。
为了简化问题,我们只使用一个空的 Xcode 项目。
我想获得与我在 iOS 单视图应用程序 中使用 AVPlayerViewController()
时相同的控制级别。在该应用程序中,我目前正在使用 here 提供的解决方案。
但是,只有第二个示例在我的 macOS Cocoa 应用程序中适用:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer?.addSublayer(playerLayer)
player.play()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
但是这个选项有 2 个缺点:
它在控制台中创建重复的错误消息:
2017-06-27 18:22:06.833441+0200 testVideoOnmacOS[24456:1216773] initWithSessionInfo: XPC connection interrupted
2017-06-27 18:22:06.834830+0200 testVideoOnmacOS[24456:1216773] startConfigurationWithCompletionHandler: Failed to get remote object proxy: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.rtcreportingd" UserInfo={NSDebugDescription=connection to service named com.apple.rtcreportingd}
此 AVPlayer
解决方案不提供与 AVPlayerViewController()
解决方案相同的控制。
所以我试图让下面的 AVPlayerViewController() 解决方案起作用。但它失败了:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
playerViewController.player!.play()
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
我得到的错误是:
Use of unresolved identifier 'AVPlayerViewController' - Did you mean
'AVPlayerViewControlsStyle'?
我已经尝试通过许多不同的方式来解决这个问题。如果我把它们都拼写出来,那会很混乱。我的突出问题似乎是绝大多数在线示例都是基于 iOS 的。
Thus, the main question:
How would I be able to successfully use AVPlayerViewController within my Xcode macOS Cocoa Application?
是的,成功了!
感谢 ninjaproger 的评论。
为了在 Xcode 中的 macOS Cocoa 应用程序 上从网络播放/流式传输视频,这似乎可行].
首先,在你的故事板上创建一个 AVKitPlayerView
并 link 它作为你的 NSViewController 的 IBOutlet。
然后,只需应用此代码:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
@IBOutlet var videoView: AVPlayerView!
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = videoView
playerViewController?.player = player
playerViewController?.player!.play()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
2021 年 8 月更新
好吧,这个回答已经有一段时间了,我不再投入其中了。但似乎其他人仍然在这里结束,解决方案有时需要更多工作才能正常工作。
感谢@SouthernYankee65:
有时需要转到项目文件并在“签名和功能”选项卡上选中 Outgoing Connection (Client)
。然后在info.plist
中添加App Transport Security Settings dictionary property
,然后添加Allows Arbitrary Loads boolean property
并设置为YES
.
现在正在播放视频。但是,控制台可能会出现一些错误。
我正在尝试让我的 macOS Cocoa 应用程序 Xcode 项目在我为它提供指定的 URL 时播放一些视频。
为了简化问题,我们只使用一个空的 Xcode 项目。
我想获得与我在 iOS 单视图应用程序 中使用 AVPlayerViewController()
时相同的控制级别。在该应用程序中,我目前正在使用 here 提供的解决方案。
但是,只有第二个示例在我的 macOS Cocoa 应用程序中适用:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer?.addSublayer(playerLayer)
player.play()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
但是这个选项有 2 个缺点:
它在控制台中创建重复的错误消息:
2017-06-27 18:22:06.833441+0200 testVideoOnmacOS[24456:1216773] initWithSessionInfo: XPC connection interrupted 2017-06-27 18:22:06.834830+0200 testVideoOnmacOS[24456:1216773] startConfigurationWithCompletionHandler: Failed to get remote object proxy: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.rtcreportingd" UserInfo={NSDebugDescription=connection to service named com.apple.rtcreportingd}
此
AVPlayer
解决方案不提供与AVPlayerViewController()
解决方案相同的控制。
所以我试图让下面的 AVPlayerViewController() 解决方案起作用。但它失败了:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
playerViewController.player!.play()
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
我得到的错误是:
Use of unresolved identifier 'AVPlayerViewController' - Did you mean 'AVPlayerViewControlsStyle'?
我已经尝试通过许多不同的方式来解决这个问题。如果我把它们都拼写出来,那会很混乱。我的突出问题似乎是绝大多数在线示例都是基于 iOS 的。
Thus, the main question:
How would I be able to successfully use AVPlayerViewController within my Xcode macOS Cocoa Application?
是的,成功了!
感谢 ninjaproger 的评论。
为了在 Xcode 中的 macOS Cocoa 应用程序 上从网络播放/流式传输视频,这似乎可行].
首先,在你的故事板上创建一个 AVKitPlayerView
并 link 它作为你的 NSViewController 的 IBOutlet。
然后,只需应用此代码:
import Cocoa
import AVFoundation
import AVKit
class ViewController: NSViewController {
@IBOutlet var videoView: AVPlayerView!
override func viewDidLoad() {
super.viewDidLoad()
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = videoView
playerViewController?.player = player
playerViewController?.player!.play()
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
2021 年 8 月更新
好吧,这个回答已经有一段时间了,我不再投入其中了。但似乎其他人仍然在这里结束,解决方案有时需要更多工作才能正常工作。
感谢@SouthernYankee65:
有时需要转到项目文件并在“签名和功能”选项卡上选中 Outgoing Connection (Client)
。然后在info.plist
中添加App Transport Security Settings dictionary property
,然后添加Allows Arbitrary Loads boolean property
并设置为YES
.
现在正在播放视频。但是,控制台可能会出现一些错误。