我正在尝试将人脸检测 API 集成到从 Parrot Bebop 无人机接收的视频流中。
使用 MediaCodec 类对流进行解码(http://developer.android.com/reference/android/media/MediaCodec.html http://developer.android.com/reference/android/media/MediaCodec.html)并且这工作正常。我可以使用来自解码器的解码帧数据成功访问 ByteBuffer,而不是将解码的帧数据渲染到表面视图。
我还可以访问解码的图像对象(类https://developer.android.com/reference/android/media/Image.html https://developer.android.com/reference/android/media/Image.html)从解码器,它们有一个时间戳,我得到以下信息:
- 宽度:640
- 身高:368
- 格式:YUV_420_888
我尝试做的第一件事是通过 Framebuilder (android/gms/vision/Frame.Builder) 为 Vision api (com/google/android/gms/vision/Frame) 生成 Frame 对象
...
ByteBuffer decodedOutputByteBufferFrame = mediaCodec.getOutputBuffer(outIndex);
Image image = mediaCodec.getOutputImage(outIndex);
...
decodedOutputByteBufferFrame.position(bufferInfo.offset);
decodedOutputByteBufferFrame.limit(bufferInfo.offset+bufferInfo.size);
frameBuilder.setImageData(decodedOutputByteBufferFrame, 640, 368,ImageFormat.YV12);
frameBuilder.setTimestampMillis(image.getTimestamp());
Frame googleVisFrame = frameBuilder.build();
这段代码不会给我任何错误,并且 googleVisFrame 对象不为空,但是当我调用时googleVis.getBitmap()
, I get null
。随后,面部检测不起作用(我想是因为我的视觉框架对象存在问题......)
即使这可行,我也不确定如何使用视觉 API 处理视频流,因为我找到的所有代码都演示了内部摄像头的使用。
如果您能为我指出正确的方向,我将非常感激。