Android人脸检测API-存储的视频文件
我想使用Android VisionAndroid人脸检测API-存储的视频文件,android,video,face-detection,android-vision,Android,Video,Face Detection,Android Vision,我想使用Android VisionFaceDetectorAPI对视频文件(例如用户库中的MP4)执行人脸检测/跟踪。我可以看到许多使用该类对直接来自摄影机的流(例如)执行人脸跟踪的示例,但在视频文件上没有 我试着通过Android Studio查看CameraSource的源代码,但它被混淆了,我无法在线查看原始代码。我认为使用相机和使用文件有很多共同点。大概我只是在表面上播放视频文件,然后将其传递到管道 或者,我可以看到Frame.Builder具有函数setImageData和setti
FaceDetector
API对视频文件(例如用户库中的MP4)执行人脸检测/跟踪。我可以看到许多使用该类对直接来自摄影机的流(例如)执行人脸跟踪的示例,但在视频文件上没有
我试着通过Android Studio查看CameraSource
的源代码,但它被混淆了,我无法在线查看原始代码。我认为使用相机和使用文件有很多共同点。大概我只是在表面上播放视频文件
,然后将其传递到管道
或者,我可以看到Frame.Builder
具有函数setImageData
和settimestampmilliss
。如果我能够以ByteBuffer
的身份读取视频,我将如何将其传递给FaceDetector
API?我猜是相似的,但没有答案。类似地,将视频解码为位图
帧,并将其传递给setBitmap
理想情况下,我不想将视频渲染到屏幕上,处理速度应该与FaceDetector
API的速度一样快
或者,我可以看到Frame.Builder有函数setImageData和setTimestampMillis。如果我能够以ByteBuffer的身份阅读视频,我将如何将其传递给FaceDetector API
只需调用SparseArray faces=detector.detect(frame)代码>其中检测器
必须按如下方式创建:
FaceDetector detector = new FaceDetector.Builder(context)
.setProminentFaceOnly(true)
.build();
如果处理时间不是问题,使用MediaMetadataRetriever.getFrameAtTime
可以解决问题。正如安东所建议的,您也可以使用面部检测器。检测:
Bitmap bitmap;
Frame frame;
SparseArray<Face> faces;
MediaMetadataRetriever mMMR = new MediaMetadataRetriever();
mMMR.setDataSource(videoPath);
String timeMs = mMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); // video time in ms
int totalVideoTime= 1000*Integer.valueOf(timeMs); // total video time, in uS
for (int time_us=1;time_us<totalVideoTime;time_us+=deltaT){
bitmap = mMMR.getFrameAtTime(time_us, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); // extract a bitmap element from the closest key frame from the specified time_us
if (bitmap==null) break;
frame = new Frame.Builder().setBitmap(bitmap).build(); // generates a "Frame" object, which can be fed to a face detector
faces = detector.detect(frame); // detect the faces (detector is a FaceDetector)
// TODO ... do something with "faces"
}
位图;
框架;
稀疏面;
MediaMetadataRetriever mMMR=新的MediaMetadataRetriever();
mMMR.setDataSource(视频路径);
String timeMs=mMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//视频时间(毫秒)
int totalVideoTime=1000*整数值(timeMs);//总视频时间(以美国为单位)
对于(int time_us=1;time_usThanks)。您知道如何获取视频文件并为FaceDetector API生成正确类型的ByteBuffer吗?或者您能给我指出一个链接吗?我提到的问题(33173525)是在将数据转换为正确的缓冲区格式(ImageFormat.YV12)时遇到问题,并且没有发布解决方案。MediaCodec API是“官员"现在做这些事情的方法。虽然过于复杂。也许你会在ffmpeg库中获得更大的成功,但我更愿意使用MediaCodec。这里有一个开源版本的CameraSource:你解决了你的问题了吗,我也面临着同样的问题?你的for循环在做什么,请详细说明人脸,我们得到的是人脸检测到的帧或视频它实际上是什么?以及如何处理它们?我可以将其转换为位图还是将其保存到文件中?您在mMMR.getFrameAtTime…
中已经有位图。因此,您可以只检查faces
是否为空,并将位图存储在一个文件中。这将包含整个帧,但如果需要特定的面,则类Face
具有获取帧内位置等的方法