Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android人脸检测API-存储的视频文件_Android_Video_Face Detection_Android Vision - Fatal编程技术网

Android人脸检测API-存储的视频文件

Android人脸检测API-存储的视频文件,android,video,face-detection,android-vision,Android,Video,Face Detection,Android Vision,我想使用Android VisionFaceDetectorAPI对视频文件(例如用户库中的MP4)执行人脸检测/跟踪。我可以看到许多使用该类对直接来自摄影机的流(例如)执行人脸跟踪的示例,但在视频文件上没有 我试着通过Android Studio查看CameraSource的源代码,但它被混淆了,我无法在线查看原始代码。我认为使用相机和使用文件有很多共同点。大概我只是在表面上播放视频文件,然后将其传递到管道 或者,我可以看到Frame.Builder具有函数setImageData和setti

我想使用Android Vision
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
具有获取帧内位置等的方法