我正在为 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() 方法只被调用一次。即使我在屏幕上做事,它也不会再被调用。我在这里想念什么?在传递给编码器之前是否有任何不那么棘手的方法来访问帧?