在Swift 4/Xcode 9中从URL播放视频文件:共享音频展示上下文不可用的AVF上下文。

3

我正在尝试实现一个AVPlayer,它可以从URL加载和播放视频。这个AVPlayer被放置在一个由按钮调用的函数中。以下是我的当前代码:

import UIKit
import AVKit
import AVFoundation

class MovieDetailViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func playTrailer(_ sender: Any) {
        guard let videoURL = URL(string: "http://caribbeancinemas.com/img/trailers/6134.mp4") else {
            return
        }

        let player = AVPlayer(url: videoURL)
        let controller = AVPlayerViewController()
        controller.player = player

        present(controller, animated: true) {
            player.play()
        }
    }
}

当我在模拟器上运行应用程序时,视频实际上可以播放,但是发生了两个问题:
  1. 控制台中会收到以下错误信息:
  2. 2018-03-31 16:49:53.389148-0400 MoviesApp[18928:3137301] [MediaRemote] [AVOutputContext] WARNING: AVF context unavailable for sharedAudioPresentationContext 2018-03-31 16:49:53.497987-0400 MoviesApp[18928:3137301] [framework] CUICatalog: Invalid asset name supplied: '(null)' 2018-03-31 16:49:53.498937-0400 MoviesApp[18928:3137301] [framework] CUICatalog: Invalid asset name supplied: '(null)' 2018-03-31 16:49:53.857871-0400 MoviesApp[18928:3138058] Task <223C4724-B3B5-4EBE-9AE0-5BA3C30B37C6>.<2> finished with error - code: -999 2018-03-31 16:49:55.365686-0400 MoviesApp[18928:3138196] Task <95E91605-9B52-4212-97B3-47E73CE21B8B>.<1> finished with error - code: -999

  3. 视频播放器不会立即开始播放视频(缓冲),而似乎要等到完整的视频下载完毕后才开始播放。
我已经在这里寻找解决方案,但是还没有找到一个,所以任何帮助都将不胜感激。
提前致谢!

你找到这个问题的解决方案了吗?我也遇到了同样的错误。 - CocaCola
不,我仍然得到相同的错误。 - ahols
1个回答

0
@IBAction func playTrailer(_ sender: Any) {
        guard let videoURL = URL(string: "http://caribbeancinemas.com/img/trailers/6134.mp4") else {
            return
        }

        let videoAsset = AVURLAsset(url: videoURL! as URL)
        let item = AVPlayerItem(asset: videoAsset)
        let player = AVPlayer(playerItem: item)
        let controller = AVPlayerViewController()
        controller.player = player

        present(controller, animated: true) {
            player.play()
        }
    }

嗯,我尝试了这个方法,但是得到了相同的结果。它还告诉我要删除强制解包和转换“!as URL”。你能详细说明一下你的答案以及为什么需要AVURLAsset和AVPlayerItem吗?谢谢。 - ahols
为避免问题:提供了无效的资产名称:'(null)'。 - Bappaditya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接