【问题标题】:AVPlayer playback fails while AVAssetExportSession is active as of iOS 10自 iOS 10 起 AVAssetExportSession 处于活动状态时,AVPlayer 播放失败
【发布时间】:2016-09-18 17:06:34
【问题描述】:

AVPlayer 会随机播放音频,不显示视频轨道...

在具有AVAssetExportSession:exportAsynchronouslyWithCompletionHandler 的活动压缩会话时使用AVPlayer 正确播放视频现在失败。似乎它会导致一些不稳定,直到应用进入后台并返回。

视频播放失败时检查AVURLAsset,即使没有视频输出,也有视频轨道。我也没有从压缩器或其他播放组件中收到任何错误...即使在压缩会话返回后一段时间内也会出现问题。

我以不同的方式尝试了单独的线程,但没有成功。

似乎从 iOS 10 开始,幕后发生了一些事情,导致两个进程之间发生某种冲突......

【问题讨论】:

  • 你有重现问题的示例项目吗?
  • 您的AVAudioSession 类别和选项是什么?
  • 出于好奇,您可以尝试在选项中添加AVAudioSessionCategoryOptionMixWithOthers 吗?
  • 我遇到了这个确切的问题stackoverflow.com/questions/39760147/…,它似乎特定于 AVVideoCompositionCoreAnimationTool。我可以成功地将 AVAssetExportSession 与自定义视频合成器一起使用,但使用 CA 工具会使一切出错。
  • 你打赌。这是一个演示该错误的示例项目的链接:github.com/claygarrett/avplayer-bug

标签: avplayer ios10 avassetexportsession


【解决方案1】:

刚刚收到 Apple DTS 的消息。他们也同意这指向 Apple iOS 错误并要求我记录它。

我完全取消了AVAssetExportSession 的使用,它解决了这个问题。所以调用AVAssetExportSession 结合其他的 AV 方法是导致 iOS 不稳定的原因。

就我而言,我使用AVAssetExportSession 进行捕获后压缩。所以我使用AVAssetWriter 将每一帧实时采样为我需要的格式...

希望 Apple 尽快解决此问题。

【讨论】:

  • 如果有人找到解决方法或收到 Apple 的回复,他们能否发表评论,他们是如何做到的?我不得不将视频背景设置为一条消息,告诉用户关闭和打开应用程序,这是一种非常可怕的体验。
  • 你如何使用'AVPlayer'和'AVAssetExportSession'?
  • 我正在使用 AVExportSession 将一堆视频连接在一起,然后使用 AVPlayer 播放生成的视频
  • 我可以确认这是我使用的导致问题的原因。我发现如果您在 AVExportSession 完成处理之后再开始播放之前添加一个短空格,这可能会解决问题。
  • @AndresCanella,你在说什么短空间?我在播放前添加了 2 秒的延迟,但我仍然遇到这个问题(这是真的,不是那么频繁,但仍然很烦人)。有时至少需要 10 秒才能正确播放。您是否找到任何其他解决方法?你能分享一下苹果的回复链接吗?谢谢:)
【解决方案2】:

我找到了解决问题的方法。就像萨米说的那样,问题似乎出在我用来给视频加水印的 AVVideoCompositionCoreAnimationTool 中。我转而使用 CIFilter,它实际上有更清晰的代码。

我使用 CoreAnimationTool 删除了所有内容并使用了这个(mixComposition 是我的 AVMutableComposition):

let watermarkFilter = CIFilter(name: "CISourceOverCompositing")!
let watermarkImage = CIImage(image: #imageLiteral(resourceName: "watermark"))!
let videoComposition = AVVideoComposition(asset: mixComposition) { (filteringRequest) in
    let source = filteringRequest.sourceImage.clampingToExtent()
    watermarkFilter.setValue(source, forKey: "inputBackgroundImage")
    let transform = CGAffineTransform(translationX: filteringRequest.sourceImage.extent.width - watermarkImage.extent.width - 2, y: 0)
    watermarkFilter.setValue(watermarkImage.applying(transform), forKey: "inputImage")
    filteringRequest.finish(with: watermarkFilter.outputImage!, context: nil)
}

然后在 AVAssetExportSession 中添加了这个:

exporter!.videoComposition = videoComposition

希望对某人有所帮助!

【讨论】:

  • 您还在使用 AVAssetExportSession:exportAsynchronouslyWithCompletionHandl‌​er 吗?
  • 您有没有机会通过自定义 AVVideoCompositing 类解决旋转问题?它不尊重资产转换,请求中的所有 CIFilter 始终处于横向......我们坚持了一个多星期啊
猜你喜欢
  • 1970-01-01
  • 2019-09-02
  • 2013-12-02
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多