Упрощенный захват экрана: записывать видео только то, что появляется в слоях UIView?

Этот ответ "SO" описывает, как сделать снимок экрана UIView. Нам нужно что-то подобное, но вместо одного изображения цель состоит в том, чтобы создать видеоролик обо всем, что появляется в течение UIView более 60 секунд, - концептуально, как запись только слоев этого UIView, игнорируя другие слои.

Наше видеоприложение накладывает слои на то, что пользователь записывает, и конечной целью является создание основного видео, объединяющего эти слои с оригинальным видео. Однако использование AVVideoCompositionCoreAnimationTool для объединения слоев с исходным видео очень, очень и очень медленно: экспорт 60-секундного видео занимает 10-20 секунд.

Мы обнаружили, что объединение двух видео (т.е. только с использованием AVMutableComposition без AVVideoCompositionCoreAnimationTool) выполняется очень быстро: ~ 1 секунда. Надеемся создать независимое видео слоев, а затем объединить его с оригинальным видео только с помощью AVMutableComposition.

Ответ в Swift идеален, но не требуется.

Ответ 1

Похоже, что ваше "быстрое" слияние не связано с (re) -кодированием кадров, т.е. тривиальным и в основном прославленным конкатенацией файлов, поэтому он получает 60x в реальном времени. Я спросил об этом, потому что ваш "очень медленный" экспорт с 3-6 раз в реальном времени, что на самом деле не так страшно (по крайней мере, это не было на устаревшем оборудовании).

Кодирование фреймов с AVAssetWriter должно дать вам представление о максимально возможном нетривиальном экспорте, и это может показать, что на современном оборудовании вы можете сократить или сократить время экспорта в два раза.

Это длинный способ сказать, что может быть не так много производительности. Если вы думаете о типичном примере использования кодирования видео iOS, который, вероятно, будет записывать 1920p @120 кадров в секунду или 240 кадров в секунду, ваша кодировка в режиме ~ 6x в реальном времени @30 кадров в секунду находится на переднем плане того, что вашему типичному устройству iOS "нужно", чтобы сделать.

Доступны вам оптимизационные возможности (например, низкоуровневые или частотные кадры), но это может лишить вас возможности захвата CALayer s.