3

我正在尝试将人脸检测 api 集成到我从鹦鹉 bebop 无人机接收的视频流中。

流使用 MediaCodec 类 ( http://developer.android.com/reference/android/media/MediaCodec.html ) 解码,这工作正常。无需将解码的帧数据渲染到表面视图,我可以使用来自解码器的解码帧数据成功访问 ByteBuffer。

我还可以从解码器访问解码的图像对象(类https://developer.android.com/reference/android/media/Image.html),它们有一个时间戳,我得到以下信息:

  • 宽度:640
  • 身高:368
  • 格式:YUV_420_888

我尝试做的第一件事是通过 Framebuilder (android/gms/vision/Frame.Builder) 为视觉 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(),我得到null. 随后,面部检测不起作用(我想是因为我的视野框架对象存在问题......)

即使这可行,我也不确定如何使用视觉 api 处理视频流,因为我找到的所有代码都演示了内部摄像头的使用。

如果你能指出我正确的方向,我将非常感激。

4

0 回答 0