iOS 10版本中,AVAssetExportSession处于活动状态时,AVPlayer的播放会失败。

10
“AVPlayer”只会随机播放音频,不显示视频轨道...
在进行“AVAssetExportSession:exportAsynchronouslyWithCompletionHandler”的活动压缩会话时,使用“AVPlayer”正常播放视频现在失败了。 这似乎会导致一些不稳定性,一直持续到应用程序进入后台并回来。
当视频播放失败时,检查“AVURLAsset”,即使没有视频输出,也有视频轨道。 我也没有从压缩器或其他播放组件中获得任何错误...问题甚至在压缩会话返回后一段时间内仍然存在。
我已尝试过不同的分线程方式,但均未成功。
自iOS 10以来,似乎在后台发生某种冲突,导致两个进程之间存在冲突...

1
你有一个能够重现问题的示例项目吗? - Rhythmic Fistman
1
你的 AVAudioSession 类别和选项是什么? - Rhythmic Fistman
1
你可以试着在选项中添加 AVAudioSessionCategoryOptionMixWithOthers 吗?这只是出于好奇。 - Rhythmic Fistman
1
我遇到了与此完全相同的问题https://dev59.com/Y5vga4cB1Zd3GeqPxy7i#39780044,似乎是与AVVideoCompositionCoreAnimationTool有关。我可以成功地使用具有自定义视频合成器的AVAssetExportSession,但是使用CA工具会使一切都出错。 - Sami Samhuri
1
没问题。这是一个演示该bug的样例项目链接:https://github.com/claygarrett/avplayer-bug - Clay Garrett
显示剩余11条评论
2个回答

8
刚刚收到苹果DTS的消息。他们也认为这指向了一个苹果iOS的bug,并要求我记录下来。
我完全剪掉了对AVAssetExportSession的使用,这解决了问题。因此,同时调用其他AV方法和AVAssetExportSession会导致iOS不稳定。
在我的情况下,我正在使用AVAssetExportSession进行捕获后压缩。因此,我改用AVAssetWriter实时采样每个帧并转换为我需要的格式...
希望苹果尽快解决这个问题。

@Sam Apple没有透露更多信息,只是怀疑这是iOS AV漏洞。 - Andres Canella
@AndresCanella 谢谢。我也开了一个错误报告。他们说这是一个重复的问题,将被关闭。我说这个答案根本没有帮助。他们回复说他们正在解决这个问题,但没有关于何时修复的信息。 - Sam
@Sam 哈哈,是的,我想修复它可能需要很长时间,而且它深入到我们无法触及的地方...感谢分享。看起来目前这仍然是唯一的选择。 - Andres Canella
@AndresCanella 哈哈,苹果还没有更新,问题仍然存在。请问Andres能否发布一个解决方案? - Sam
@AndresCanella 你会如何使用AVAssetWriter替代AVAssetExportSession?真的需要帮助 :) - Sam
显示剩余7条评论

2
我找到了解决我的问题的方法。像Sami所说,问题似乎出现在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吗? - Dan Bodnar
你有没有成功解决使用自定义AVVideoCompositing类时的旋转问题?它似乎无法遵循资源的变换,请求中的所有CIFilters始终处于横向状态...我们已经卡在这个问题上一周多了。 - Roi Mulia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接