Воспроизведение AVPlayer завершается сбоем, когда AVAssetExportSession активен с iOS 10
AVPlayer
будет случайным образом воспроизводить аудио, не показывая видео дорожку...
Воспроизведение видео правильно с AVPlayer
имея активный сеанс сжатия AVAssetExportSession:exportAsynchronouslyWithCompletionHandler
сейчас терпит неудачу. Кажется, это вызывает некоторую нестабильность, которая сохраняется, пока приложение не уходит в фон и не возвращается.
Изучение AVURLAsset
при сбое воспроизведения видео, есть видео дорожка, хотя видео не выводится. Я также не получаю никаких ошибок от компрессора или других компонентов воспроизведения... Проблема возникает даже на некоторое время после завершения сеанса сжатия.
Я пробовал отдельные потоки по-разному, но безуспешно.
Похоже, что в iOS 10 что-то происходит под капотом, что вызывает своего рода конфликт между обоими процессами...
2 ответа
Только что слышал от Apple DTS. Они также согласны с тем, что это указывает на ошибку Apple iOS, и попросили меня ее зарегистрировать.
Я отключил использование AVAssetExportSession
в целом и это решило проблему. Так зовет AVAssetExportSession
в сочетании с другими AV-методами это является причиной нестабильности iOS.
В моем случае я использовалAVAssetExportSession
для сжатия после захвата. Так что вместо этого я использовал AVAssetWriter
чтобы сэмплировать каждый кадр в режиме реального времени в нужном мне формате...
Надеюсь, это скоро будет исправлено Apple.
Я нашел решение своей проблемы. Как сказал Сами, проблема, по-видимому, связана с 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
Надеюсь, это кому-нибудь поможет!