CoreImage + AVAssetWriter время от времени приводит к блокировке основного потока - PullRequest
0 голосов
/ 17 февраля 2020

Я использую CoreImage для составных кадров, а затем записываю в файл с помощью AVAssetWriterInputPixelBufferAdaptor.assetWriterInput.requestMediaDataWhenReady для DispatchQueue (метка: «videoQueue», qos: .utility, autoreleaseFrequency: .workItem). Кадры CIImage обычно состоят из 3 изображений и нескольких CIF-фильтров. Результирующие файлы обычно имеют 5-10 секунд, 30 кадров в секунду и 7500000 битрейта, поэтому это не отдельные большие файлы.

[код для рендеринга фреймов и записи файла не включен, поскольку он очень похож на многие ответы SO, которые делают то же самое, и тот же код работает правильно на iOS]

Проблема это происходит только изредка, и это не связано с такими факторами, как количество кадров или размер. Во время выполнения я могу создать более 5 различных видео, а затем, когда-нибудь во время следующего рендеринга, запись файла будет остановлена, и весь компьютер будет зависать каждые несколько секунд. Я не нашел способа вытащить из него процессор, даже если принудительно завершил работу запущенных приложений и т. Д. c. Мне нужно перезагрузить компьютер, чтобы вернуть его. Монитор процессора в Xcode будет выглядеть как на скриншоте.

enter image description here

Вопрос: Похоже, что процесс рендеринга / записи видео вызывает проблему, но не указывает, когда это произойдет и какой процесс / ошибка вызывает это. Я ищу идеи о том, как дополнительно диагностировать причину проблемы и, конечно, решить ее.

Дополнительные наблюдения, которые могут быть полезны при диагностике проблемы:

Я не рассматриваю проблемы с памятью как фактор, поскольку после записи каждого файла инструмент памяти указывает, что все из распределений, которые появились во время создания видео, появляются на всех go.

Пока приложение работает правильно, монитор ЦП показывает создание около 10 потоков, связанных с составлением CIImages и их записью. в файл.

enter image description here

Затем через несколько секунд записывается следующий файл, и вы можете увидеть активность в другом наборе ~ 10 потоков ,

enter image description here

...