簡體   English   中英

Android虛擬顯示的幀偵聽器(NDK內部版本)

[英]Frame Listener for Android Virtual Display (NDK internal build)

我正在為Android平台構建內部共享庫。 我有設備制造商提供的簽名密鑰庫。

我的圖書館正在使用Android來源的ScreenRecord.cpp內部文件。 使用MediaCodec編碼器可以很好地進行記錄; 但是我想訪問每個幀,以便在將每個幀傳遞到編碼器之前可以在它們上應用一些圖像疊加徽標。 Android源代碼中也有一個覆蓋示例,但僅適用於更新版本的Android(5.0 / API 21+)。 我想為Android Kitkat(4.4 / API 19)提供覆蓋解決方案

這是我從minicap獲得的代碼示例。

mVirtualDisplay = android::SurfaceComposerClient::createDisplay(
android::String8("minicap"),
true);

LOGI("Creating buffer queue");
mScreenshotClient.getCpuConsumer();
mBufferQueue = mScreenshotClient.mBufferQueue;

LOGI("Creating CPU consumer");
mConsumer = new android::CpuConsumer(mBufferQueue, 3, false);
mConsumer->setName(android::String8("minicap"));
mConsumer->setDefaultBufferSize(targetWidth, targetHeight);
mConsumer->setDefaultBufferFormat(android::PIXEL_FORMAT_RGBA_8888);

mConsumer->setFrameAvailableListener(mFrameProxy); 
//mFrameProxy is from:
//class FrameProxy: public android::ConsumerBase::FrameAvailableListener

LOGI("Publishing virtual display");
android::SurfaceComposerClient::openGlobalTransaction();
android::SurfaceComposerClient::setDisplaySurface(mVirtualDisplay, mBufferQueue);
android::SurfaceComposerClient::setDisplayProjection(mVirtualDisplay,
android::DISPLAY_ORIENTATION_0, layerStackRect, visibleRect);
android::SurfaceComposerClient::setDisplayLayerStack(mVirtualDisplay, 0);// default stack

android::SurfaceComposerClient::closeGlobalTransaction();

我設置了上面的代碼,但是FrameAvailableListener的onFrameAvailable()方法僅被調用一次。 即使我在屏幕上放東西,也再也不會調用它。 我在這里想念什么? 在傳遞給編碼器之前,是否沒有其他更輕松的方法來訪問幀?

Lollipop的屏幕記錄源中內置了一個添加覆蓋的示例。 據我所知,它不依賴於Lollipop中添加的任何功能,因此您應該能夠在4.4上構建和運行它。 bigflake所述,-- --bugreport模式是在4.4的時間范圍內添加到AOSP的,但實際上直到5.x才隨系統一起提供。 (稍作調整,它甚至應在4.3上運行,但我沒有嘗試過。)

關鍵源文件是Overlay.{cpp,h} 它執行與用Java編寫的代碼相同的操作:創建GLConsumer(SurfaceTexture),使用它將傳入的幀轉換為GLES紋理,然后將紋理+疊加層渲染到視頻編碼器。

示例視頻在這里 請注意,它從一開始就添加了一塊文本,並在左上角添加了運行時間戳/幀計數器。

請其他人注意:此代碼使用的是內部私有API,這些API在最新版本中已發生更改,因此任何二進制文件都必須針對特定版本的Android構建,並且即使運行不同制造商的設備也可能無法移植到由不同制造商制造的設備上相同版本的Android(有時OEM會喜歡弄亂東西)。

更新:我先前關於使用KitKat的說法並不准確-在Lollipop版本發布之前,API發生了重大變化。 訣竅是在進行此更改之前先獲取源代碼,因為那是在BufferQueue API重寫到達屏幕記錄時。 您可以從更改列表中看到--bugreport選項在此之前大約五個月出現了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM