2014-01-13 6 views
3

Можно ли использовать SurfaceComposerClient для получения скриншотов, как это делает MediaCodec с createInputSurface().получить скриншоты из SurfaceComposerClient

Я не могу использовать MediaCodec для этого, потому что мне нужно сырое видео и не закодированные данные.

с 4,3 кажется, что ScreenshotClient can not делает несколько скриншотов.

ответ

1

Да, при условии, что вы работаете как shell или root, и вы не против использования непубличных API-интерфейсов (т. Е. Вас не волнует, если ваше приложение ломается каждый раз при выходе новой версии ОС) ,

Канонический пример: screenrecord, представленный в Android 4.4. Он создает виртуальный дисплей и направляет вывод на Surface. Для нормальной работы входная поверхность MediaCodec принимает выходной сигнал. Для режима «bugreport», введенного в screenrecord v1.1, выход идет на GLConsumer (примерно эквивалент SurfaceTexture), который отображается на Surface с наложенным текстом.

+0

в screenrecord 1.1 Overlay, Что мне нужно сделать, чтобы получить необработанные байты изображения с выходаSurface (IGraphicBufferProducer)? – jacob

+0

В 'setup_l()', Overlay создает поверхность окна EGL для IGraphicBufferProducer. Это входит в видеокодер. Если вместо этого вы создаете поверхность pbuffer, вы можете использовать 'glReadPixels()' для извлечения данных после текстуры blit в 'processFrame_l()'. – fadden

+0

Я, наконец, получил его на работу, но он сильно замедляет работу устройства, в отличие от MediaCodec, который вообще не замедляется (и он также кодирует, что должно быть медленнее, чем просто захватить необработанные данные, нет?). В любом случае я могу ускорить его? – jacob

1

В Android 4.3 есть ошибка (см. Вопросы 59649 или 60638 на Android Open Source Project Issue Tracker), что означает, что ScreenshotClient не может использоваться для съемки более одного снимка экрана.