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

Posted

技术标签:

【中文标题】AVPlayer 空白视频:播放声音但没有视频【英文标题】:AVPlayer blank video: playing sound but no video 【发布时间】: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 秒之外,还有其他解决方法吗? 【参考方案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 上。

以上是关于AVPlayer 空白视频:播放声音但没有视频的主要内容,如果未能解决你的问题,请参考以下文章

xcode 8 || AVPlayer 正在显示视频,但没有播放

屏幕加载时AVPLayer显示黑屏

AVPlayer 层不显示视频内容

AVPlayer 不会在 iOS9 中播放来自 url 的视频

切换到下一个视图控制器后,AVPlayer 视频仍在播放

avplayer 不播放通过 IOS Objective-C 中的设备摄像头捕获的视频中的音频