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

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

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

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

Ответ на Swift идеален, но не обязателен.


person Crashalot    schedule 22.01.2016    source источник
comment
Не могли бы вы рассказать о быстром комбайне AVMutableComposition? Как быстро? Что вы имеете в виду под совмещением в данном случае?   -  person Rhythmic Fistman    schedule 23.01.2016
comment
В нашем тестировании объединение видео только с помощью AVMutableComposition означало, что 60-секундное видео можно было экспортировать примерно за 1 секунду (в отличие от 10-20 секунд с AVVideoCompositionCoreAnimationTool. Код объединял видео, вставляя видео в AVMutableCompositionTrack с помощью insertTimeRange. Есть предложения? @RhythmicFistman   -  person Crashalot    schedule 23.01.2016
comment
@Crashalot Возможно, я задаю вопрос, аналогичный твоему. Вы в итоге решили проблему, которая у вас была? Вот мой вопрос, это то, чего вы пытались достичь? stackoverflow.com/questions/50497671/   -  person TeaCupApp    schedule 24.05.2018


Ответы (1)


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

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

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

Вам доступны оптимизации (например, более низкая/переменная частота кадров), но они могут лишить вас возможности захватывать CALayers.

person Rhythmic Fistman    schedule 23.01.2016
comment
Спасибо за подробный ответ. Поскольку кажется, что прославленная конкатенация — единственный способ добиться сверхбыстрого времени, это восходит к исходному вопросу о том, можно ли создать видео содержимого одного UIView, а не всего экрана. Потому что тогда мы могли бы сделать быстрое слияние и эффективно сократить время экспорта. Можно ли записывать видео из одного UIView без AVVideoCompositionCoreAnimationTool? - person Crashalot; 23.01.2016