从iOS 10开始,AVAslayer播放失败,而AVAssetExportSession处于活动状态

时间:2016-09-18 17:06:34

标签: avplayer ios10 avassetexportsession

AVPlayer会随机播放音频,而不会显示视频曲目......

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

我完全删除了AVAssetExportSession的用法,它解决了这个问题。因此,将AVAssetExportSession与其他AV方法结合使用会导致iOS不稳定。

在我的情况下,我使用AVAssetExportSession进行捕获后压缩。所以我使用AVAssetWriter实时地将每个帧采样到我需要的格式......

Apple希望很快就能解决这个问题。

答案 1 :(得分:1)

我找到了解决问题的方法。像萨米说的那样,这个问题似乎出现在我用来为我的视频加水印的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

希望能帮助别人!