AVPlayer空白视频:播放声音但没有视频

时间:2016-12-09 02:41:50

标签: ios video avplayer avplayerlayer

This question有同样的问题,但解决方案无效。

AVPlayer有时会播放一个空白视频:声音但没有视频。

播放空白视频时,我们会打印播放器的框架和状态。框架非零并且已正确设置。状态也是readyToPlay。还在主线程上调用play函数。

换句话说,播放器层的帧是有效的,并且播放器也准备好播放。然而,即使有声音,也没有视频出现。

问题似乎是时间问题。如果我们在播放视频前等待5-10秒,视频每次都能正常工作。

此问题出现在iOS 10上,而不是iOS 8或9上。

Apple论坛上的

This thread表明它可能是与之相关的错误 AVVideoCompositionCoreAnimationTool,我们也使用。

任何解决方案?

这种情况在iPhone 7设备上比在iPhone 5s设备上更频繁发生。

代码:

fileprivate func playVideo(_ videoURL: String, prompt: String) {
    // Show <playerView>
    playerView.isHidden = false

    // Use new video in player
    playerItem = AVPlayerItem(url: URL(fileURLWithPath: videoURL))


    print("STATUS: \(player.status == AVPlayerStatus.readyToPlay). FRAME: \(playerLayer.frame). MAIN THREAD: \(Thread.isMainThread)")


    player.replaceCurrentItem(with: playerItem)

    // Start playing video
    player.seek(to: kCMTimeZero)
    player.actionAtItemEnd = .none
    player.play()
}

2 个答案:

答案 0 :(得分:1)

如果有人遇到此问题,问题似乎与iOS错误有关。问题不会发生在iOS 8/9设备上,仅适用于新的iOS 10设备。从iOS 10.2开始,问题就消失了。

不幸的是,仍然没有针对10.0.x或10.1.x的编程解决方案。

答案 1 :(得分:0)

我认为您需要使用AVPlayerViewController或AVPlayerLayer。

AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];

//set player layer frame and attach it to our view
playerLayer.frame = self.containerView.bounds;
[self.containerView.layer addSublayer:playerLayer];

//play the video
[player play];

来自Apple doc

  

AVPlayer和AVPlayerItem是非视觉对象,意味着它们   拥有者无法在屏幕上显示资产的视频。你有两个   您可以用来呈现视频内容的主要方法   屏幕:

     

AVKit:展示视频内容的最佳方式是使用   AVKit框架的iOS和tvOS中的AVPlayerViewController类   macOS中的AVPlayerView类。这些课程提供视频内容,   以及播放控件和其他媒体功能为您提供   全功能的播放体验。

     

AVPlayerLayer:如果您正在为播放器构建自定义界面,   您使用AVFoundation提供的Core Animation CALayer子类   叫做AVPlayerLayer。播放器图层可以设置为视图的支持   图层或可以直接添加到图层层次结构中。不像   AVPlayerView和AVPlayerViewController,播放器层没有   呈现任何播放控件,但只是呈现可视内容   在屏幕上。由你来构建回放传输控件   通过媒体播放,暂停和寻找。