AV-запись содержимого * просмотра * в фильм

#macos #avfoundation

#macos #avfoundation

Вопрос:

Я знаю, как использовать AVFoundation для захвата содержимого экрана в файл фильма, но вместо этого я хотел бы захватить содержимое NSView. Мое приложение выполняет некоторые действия в представлении, и в настоящее время для создания файла фильма мне нужно записать весь экран (обрезанный, конечно). Пользователю было бы намного проще, если бы приложение могло работать в фоновом режиме и все еще записывать сеанс. Я подумал, может быть, создать поддельный экран и попытаться отразить там содержимое представления, но это кажется слишком сложным.

Комментарии:

1. Вы отображаете с -drawRect помощью или с помощью дерева слоев в своем представлении?

2. На самом деле это веб-просмотр. Я пытаюсь захватить содержимое содержимого электронного приложения.

Ответ №1:

Я добился некоторого успеха с чистым деревом CALayer, используя CARenderer в контексте OpenGL старого стиля в CVOpenGLTextureCache / AVAssetWriter, а затем также отображая его в обычном представлении или слое GL для отображения.

Однако в старом средстве визуализации есть некоторые особенности, поэтому вам, возможно, придется немного подправить, чтобы заставить его работать с retina и т. Д. Не пробовал использовать правильное дерево NSView, и сопровождающие CA были удивлены, что это сработало на WWDC. Поэтому будущая поддержка может быть ограничена.

Хотя, похоже, это хороший запрос, я был бы рад сослаться на ваш радар.

Ответ №2:

AFAICR, нет явного API для захвата NSView. Что вам нужно будет сделать, так это отобразить его покадрово, или, если все интересное содержимое просмотра основано на слоях, используя AVVideoCompositionCoreAnimationTool .

Первый подход (покадровый рендеринг), вероятно, будет медленным, и некоторые методы компоновки будут отображаться неправильно в программном средстве визуализации. Это сводится к использованию AVAssetWriter и AVAssetWriterInputPixelBufferAdaptor и передаче ему кадров. Довольно просто (но требует много кода) создать пиксельный буфер, который разделяет память с a CGBitmapContext , затем создать буферы выборки из этих пиксельных буферов, затем передать эти буферы выборки в конвейер записи ресурсов, а затем записать этот ресурс на диск в виде файла m4v.

Последний подход (рендеринг некоторой coreanimation) — это … много работы. Нужно было бы знать намного больше о отображаемом содержимом, чтобы предложить точный подход.

Комментарии:

1. В документации для AVVideoCompositionCoreAnimationTool говорится: «Избегайте использования слоев, связанных с UIView объектами». Я понимаю, что инструмент станет родительским для слоя, что сделает его бесполезным для отображения содержимого NSView.