如何在Swift中使用AV Kit Player View Controller播放视频?
override func viewDidLoad() {
super.viewDidLoad()
let videoURLWithPath = "http://****/5.m3u8"
let videoURL = NSURL(string: videoURLWithPath)
playerViewController = AVPlayerViewController()
dispatch_async(dispatch_get_main_queue()) {
self.playerViewController?.player = AVPlayer.playerWithURL(videoURL) as AVPlayer
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试了多种不同的技术在 SceneKit 中播放视频,但似乎都无法正常工作。
我尝试将 AVPlayerLayer 分配给 SCNMaterial.diffuse.contents ,但根本无法显示任何视频帧,尽管声音播放得很好。
我还尝试将包含 SKVideoNode 子节点的 SpriteKite SKScene 分配给 SCNMaterial.diffuse.contents,并且效果很好,尽管(正如 StackOverflow 上的其他人指出的)每次播放视频时都会泄漏兆字节的内存,直到最后 iOS杀死应用程序。
最后,由于它现在在 iOS 11.0+ 中受支持并受到 @mnuages 和其他人的推荐,我尝试将 AVPlayer 直接分配给 SCNMaterial.diffuse.contents ,虽然它可以播放并且不会泄漏内存,但不幸的是它有很多糟糕的视觉效果(即使在 iOS 12.1.2 上)。特别是,正如其他开发人员所指出的,每次将 AVPlayer 实例分配给材质并开始播放时,SceneKit 都会多次将以下内容记录到控制台:
[SceneKit] 错误:无法获取像素缓冲区 (CVPixelBufferRef)
日志消息可能是可接受的,但每次出现错误时,场景中的视频帧都会显示为全白色,这会导致每次播放新视频时闪烁几分之一秒。
这种技术的一个更糟糕的视觉伪影是我所说的“迷幻彩虹”效果,它会在 AVPlayer 分配给材质时随机向相邻节点添加闪闪发光的颜色噪声图案(无论它是在播放还是暂停)。它看起来有点酷(请参阅随附的屏幕截图),但并不完全是我们想要的应用程序。
有谁知道如何使这些技术之一可靠地工作?
这是我用来测试将 AVPlayer 直接分配给材质的一些代码:
class GameViewController: UIViewController {
var plane: SCNPlane!
var planeNode: SCNNode!
var playerObserver: NSKeyValueObservation?
var playerCompletionObserver: NSObjectProtocol?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
guard let scnView = self.view as? SCNView else …
Run Code Online (Sandbox Code Playgroud) 你如何播放流媒体视频AVPlayer
?
import Cocoa
import AVKit
class StreamViewController: NSViewController {
var videoPlayer: AVPlayer!
@IBOutlet weak var moviePlayerView: AVPlayerView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
}
override func viewDidAppear() {
super.viewDidAppear()
openStream()
}
func openStream() {
completeOpenStream { (done) -> (Void) in
if done {
print("done!")
}
}
}
func completeOpenStream(completionHandler: @escaping (Bool) -> (Void)) -> Void {
DispatchQueue.global().async() {
let urlString = "http://samples.mplayerhq.hu/V-codecs/h264/interlaced_crop.mp4" // You can open it with QuickTime.
let url = URL(fileURLWithPath: …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个自定义视频播放器来从服务器流式传输 HLS 视频。我可以使用 AVPlayerItem 和 AVPlayer 成功播放 HLS 视频。
之后我想为我的视频播放器添加字幕轨道和音轨。所以我使用 AVMutableComposition 来做到这一点。所以现在的问题是,当我为 HLS 视频创建 AVURLAsset 时,我无法从 AVURLAsset 获取视频轨道。它总是给我 0 个曲目。我尝试了 AVURLAsset 的“loadValuesAsynchronously”,并尝试为 AVPlayerItem 的“轨道”添加 KVO。但这些都没有给我带来任何积极的结果。
我正在使用以下代码。
func playVideo() {
let videoAsset = AVURLAsset(url: videoURL!)
let composition = AVMutableComposition()
// Video
let videoTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
do {
let tracks = videoAsset.tracks(withMediaType: .video)
guard let track = tracks.first else {
print("Can't get first video track")
return
}
try videoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: track, at: kCMTimeZero)
} catch {
print(error)
return …
Run Code Online (Sandbox Code Playgroud) 在以前版本的 iOS 中,使用视频加载 AVPlayerViewController(以及 SwiftUI VideoPlayer)将显示第一帧并在中心包含一个播放图标,但这在 iOS 16 中已消失。我一直依赖该 UI 元素作为“这里有一个视频,点击它”的可见性。
另外,现在点击视频会显示视频的播放控件几秒钟,而不仅仅是开始播放。
有谁知道是否:
刚开始使用AVKit,我正在尝试播放一些音频.使用Mastering Modern Media Playback中详细介绍的新AVPlayerViewController会很不错,这样我就可以使用现成的播放/暂停/搜索UI.我基本上有一个带有容器视图的故事板,它有一个嵌入到AVPlayerViewController的segue.然后我用:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "embedAudio") {
var playerViewController:AVPlayerViewController = segue.destinationViewController as AVPlayerViewController
playerViewController.player = AVPlayer(URL: NSURL(string: "http://dts.podtrac.com/redirect.mp3/files.serialpodcast.org/sites/default/files/podcast/1420057326/serial-s01-e01.mp3"))
}
}
Run Code Online (Sandbox Code Playgroud)
它很好地嵌入并播放,但它有一个大的黑色QuickTime符号,视频将在其中.我想知道是否有办法让它看起来更像是音乐或播客应用程序.
我在我的实时应用程序中遇到崩溃.在这里发布Crashlytics的崩溃报告.你能指导我这个吗?
Fatal Exception: UIViewControllerHierarchyInconsistency child view controller:<AVFullScreenPlaybackControlsViewController:> should have parent view controller:<MyAVPlayerViewController:> but actual parent is:<AVFullScreenViewController:>
Fatal Exception: UIViewControllerHierarchyInconsistency
Fatal Exception: UIViewControllerHierarchyInconsistency
0 CoreFoundation 0x181616db0 __exceptionPreprocess
1 libobjc.A.dylib 0x180c7bf80 objc_exception_throw
2 CoreFoundation 0x181616cf8 -[NSException initWithCoder:]
3 UIKit 0x1867f5010 -[UIView(Hierarchy) _associatedViewControllerForwardsAppearanceCallbacks:performHierarchyCheck:isRoot:]
4 UIKit 0x18677cdbc -[UIView(Hierarchy) _willMoveToWindow:withAncestorView:]
5 UIKit 0x18677c13c -[UIView(Internal) _addSubview:positioned:relativeTo:]
6 AVKit 0x18cab3860 -[AVPlayerViewController _updatePlaybackControlsViewController]
7 AVKit 0x18cab20e4 -[AVPlayerViewController observeValueForKeyPath:ofObject:change:context:]
8 Foundation 0x181f37d84 -[NSKeyValueObservance observeValueForKeyPath:ofObject:change:context:]
9 Foundation 0x181f13f64 NSKeyValueNotifyObserver
10 Foundation 0x181f13a8c NSKeyValueDidChange
11 Foundation 0x181efe624 -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:]
12 AVKit …
Run Code Online (Sandbox Code Playgroud) 我的主要目标是使用 SwiftUI 在 HStack/VStack 的视图中嵌入 GIF/MP4 文件。我了解代码需要符合“可表示”协议。我第一次尝试这样做如下:
import SwiftUI
import AVKit
struct GIF : UIViewControllerRepresentable {
let url_name: String
func makeUIViewController(context: UIViewControllerRepresentableContext<GIF>) -> AVPlayerViewController {
return AVPlayerViewController()
}
func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<GIF>) {
let url = URL(string: url_name)!
let player = AVPlayer(url: url)
let vc = AVPlayerViewController()
vc.player = player
//PROBLEM
self.present(vc, animated: true){
vc.player?.play()
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我认为“自我”在这里没有任何意义,我们需要引用一个视图。我们将如何做到这一点?我们不能只在故事板中创建视图,因为我想将视图控制器与 SwiftUI 集成。
任何帮助,将不胜感激。
PS 这是我的第一个 iOS 应用程序,所以如果我在这里遗漏了一些非常明显的东西,请尽量保持友善!
VideoPlayer(player: AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "*****", ofType: "mp4")!)))
Run Code Online (Sandbox Code Playgroud)
如何隐藏视频播放器上的按钮。我希望视频能够不断重复。您可以通过导入 AVKit 库来访问 VideoPlayer 对象。
import AVKit
Run Code Online (Sandbox Code Playgroud)
VideoPlayer
当我将view 放入NavigationView
的父视图或子视图中时,就会出现问题。在此示例中,子视图将显示导航栏:
struct ParentView: View {
var body: some View {
NavigationView {
VStack {
Text("Parent View")
NavigationLink(destination: ChildView().navigationBarHidden(true)) {
Text("Child View")
}
}
.navigationBarHidden(true)
}
}
}
struct ChildView: View {
var body: some View {
VStack {
Text("Child View")
VideoPlayer(player: AVPlayer())
}
}
}
Run Code Online (Sandbox Code Playgroud) navigationbar avkit navigationview swiftui swiftui-navigationlink
avkit ×10
ios ×6
swift ×6
swiftui ×4
avfoundation ×3
avplayer ×3
uikit ×2
arkit ×1
audio ×1
m3u8 ×1
macos ×1
objective-c ×1
scenekit ×1
video-player ×1