【问题标题】:AVPlayer not playing and layer not showingAVPlayer 不播放和图层不显示
【发布时间】:2016-12-20 01:53:19
【问题描述】:

我正在使用一个 Objective-C 项目作为一个非常相似的 Swift 应用程序的参考。基本上,视频会上传到 Firebase,下载 URL 会保存到“Post”对象,并在检索时在 UITableViewCell 中播放。在 Objective-C 项目(也使用 Firebase)中,它运行良好,但我在 Swift 中遇到了一些麻烦。

Objective-C 代码,在单元格内,就像我说的,完美运行。

- (void)playVideoWithURL:(NSURL *)url {

    self.videoPlayer = [[AVPlayer alloc]initWithURL:url];
    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];
    layer.frame = self.videoView.bounds;
    [layer setVideoGravity:AVLayerVideoGravityResizeAspect];
    [self.videoView.layer addSublayer:layer];

    [self.videoPlayer play]; 

}

同样在单元格内的 Swift 代码不会抛出任何错误或崩溃,编译器说 URL 存在以及播放器和图层(其帧 not CGRectZero,也检查过)。

@IBOutlet var usernameLabel: UILabel!
@IBOutlet var captionLabel: UILabel!
@IBOutlet var avPlayerView: UIView!

var videoPlayer : AVPlayer!

func playVideoWithURL(url: NSURL) {

    self.videoPlayer = AVPlayer(URL: url)

    let layer = AVPlayerLayer(player: self.videoPlayer)
    layer.frame = avPlayerView.bounds
    layer.videoGravity = AVLayerVideoGravityResizeAspect
    avPlayerView.layer.addSublayer(layer)

    videoPlayer.play()

}

为了简单起见,我暂时不会发布任何 Firebase 代码,因为它们都可以在 Objective-C 项目中运行,并且下载 url 也可以在 Swift 中成功检索,这让我相信它无关紧要与问题。

有什么想法吗?这真让我抓狂。谢谢!

更新:

AVPlayer 实际上不是问题,因为它适用于测试视频。问题出在 Firebase,目前正在进一步调查。

【问题讨论】:

    标签: ios swift avplayer avplayerlayer


    【解决方案1】:

    尝试使用播放器项目初始化您的播放器。

    let playerItem = AVPlayerItem(URL: url)
    self.videoPlayer = AVPlayer(playerItem: playerItem)
    

    此外,您应该检查播放器的状态,以确定它何时可以使用 KVO 播放。

    Knowing when AVPlayer object is ready to play

    如果玩家的状态为failed,则该错误在playerItem.error? 中可用。检查以帮助确定问题。

    【讨论】:

    • 不,还是什么都没有。我最初也有同样的想法,但我已经初始化了 AVPlayer 没有项目,之前只有 URL,所以它必须是别的东西......不过谢谢
    • 我添加了一些额外的东西来尝试我的答案,以帮助您调试问题。您应该报告播放器状态以及遇到的任何错误。
    • 谢谢,错误为 nil 并且该项目存在,显示 Firebase 下载 URL,就像它工作的其他项目一样。不过我会研究一下KVO。我只是想知道为什么 Objective-C 代码工作得如此完美,而同样的 Swift 代码却没有。我知道这两种语言的工作方式略有不同,但仍然如此!
    • 重大突破,我使用了一个测试 URL,它工作正常,所以 AVPlayer 不是问题。然而,我确实发现,虽然从 firebase 返回的 URL 在登录到控制台时看起来相同,但 Objective-C 的一个在调试器中包含一堆属性,一个名为 _clients 的 _clients 具有相同的 url 转换为 NSCFString 而 Swift 版本只显示网址。此外,Objective-C 项目的视频上传为“Video/Quicktime”,而 Swift 项目在存储类型列中上传为“视频”。我将在上面的控制台图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多