#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.