Воспроизведение 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

Надеюсь, это кому-нибудь поможет!

Другие вопросы по тегам