【问题标题】:AVPlayer blank video: playing sound but no videoAVPlayer 空白视频:播放声音但没有视频
【发布时间】:2016-12-09 02:41:49
【问题描述】:

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

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

在播放空白视频时,我们打印了播放器的帧和状态。框架非零且设置正确。状态也是readyToPlayplay 函数也在主线程上被调用。

也就是说,播放器层的帧是有效的,播放器也可以播放了。然而没有视频出现,即使有声音。

这个问题似乎是一个时间问题。如果我们在播放视频前等待 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()
}

【问题讨论】:

  • 你能在这里显示你的代码吗?以及屏幕上显示的播放器大小
  • @Horst 确定更新了问题。谢谢!
  • 你能在 github 上放一个能重现问题的项目吗?
  • @RhythmicFistman 会尝试,但项目很复杂,因此需要一段时间来简化它,以便于调试。还看到了您对 ios 10 上 avplayer 问题的相关问题的回复。这可能是 ios 10 的错误,因为代码在 ios 9 和 8 上运行,但不再需要这些设备进行测试。
  • 我有一个我认为是类似的问题。除了等待 5-10 秒之外,还有其他解决方法吗?

标签: ios video avplayer avplayerlayer


【解决方案1】:

我认为你需要使用 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:展示视频内容的最佳方式是使用 iOS 和 tvOS 中的 AVKit 框架的 AVPlayerViewController 类或 macOS 中的 AVPlayerView 类。这些课程展示了视频内容, 以及播放控件和其他媒体功能,为您提供 功能齐全的播放体验。

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

【讨论】:

  • 对,对不起,省略了我们为播放器层设置框架的代码。帧在代码的其他地方正确设置,在视频播放时由帧验证。这个问题似乎是一个时间问题。如果我们在播放视频之前等待 5-10 秒,则视频每次都能正常播放。
【解决方案2】:

如果有人遇到此问题,则问题似乎与 iOS 错误有关。该问题不会出现在 iOS 8/9 设备上,只会出现在新的 iOS 10 设备上。从 iOS 10.2 开始,问题就消失了。

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

【讨论】:

  • 不出所料,问题又出现在 iOS 12 和 13 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多