将人脸检测与媒体播放器活动集成-Android

将人脸检测与媒体播放器活动集成-Android,android,android-studio,android-mediaplayer,face-detection,Android,Android Studio,Android Mediaplayer,Face Detection,如果检测到人脸(在相机预览活动中),我想开始mediaPlayer录制(在主活动中编码)。我需要什么命令才能从其他活动启动mediaPlayer,使其在启动的同时保持其他mediaPlayer功能正常运行,例如释放、停止等。我无法解决此问题,需要解决方案/方法来实现 我已尝试以中的静态成员身份访问主活动的媒体播放器对象 CameraPreview活动,但它开始捕获,但失败 释放相机资源,使其无法存储捕获的视频。 AndroidVideoCapture活动-使用MediaPlayer对象 publ

如果检测到人脸(在相机预览活动中),我想开始mediaPlayer录制(在主活动中编码)。我需要什么命令才能从其他活动启动mediaPlayer,使其在启动的同时保持其他mediaPlayer功能正常运行,例如释放、停止等。我无法解决此问题,需要解决方案/方法来实现

我已尝试以中的静态成员身份访问主活动的媒体播放器对象 CameraPreview活动,但它开始捕获,但失败 释放相机资源,使其无法存储捕获的视频。

AndroidVideoCapture活动-使用MediaPlayer对象

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    myContext = this;
    initialize();
    Log.d("FaceDetection", "face detected BASEER" );
}

private int findFrontFacingCamera() {
    int cameraId = -1;
    // Search for the front facing camera
    int numberOfCameras = Camera.getNumberOfCameras();
    for (int i = 0; i < numberOfCameras; i++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(i, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}

public void onResume() {
    super.onResume();
    if (!hasCamera(myContext)) {
        Toast toast = Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG);
        toast.show();
        finish();
    }
    if (mCamera == null) {
        // if the front facing camera does not exist
        if (findFrontFacingCamera() < 0) {
            Toast.makeText(this, "No front facing camera found.", Toast.LENGTH_LONG).show();
            switchCamera.setVisibility(View.GONE);
        }
        mCamera = Camera.open(findFrontFacingCamera());
        mCamera.setDisplayOrientation(90);
        mPreview.refreshCamera(mCamera);

    }
}

public void initialize() {
    cameraPreview = (FrameLayout) findViewById(R.id.camera_preview);
    mPreview = new CameraPreview(myContext, mCamera);
    cameraPreview.addView(mPreview);
    capture = (Button) findViewById(R.id.button_capture);
    capture.setOnClickListener(captrureListener);

}


@Override
protected void onPause() {
    super.onPause();
    // when on Pause, release camera in order to be used from other
    // applications
    releaseCamera();
}

private boolean hasCamera(Context context) {
    // check if the device has camera
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        return true;

    } else {
        return false;
    }
}

boolean recording = false;
OnClickListener captrureListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (recording) {
            // stop recording and release camera
            mediaRecorder.stop(); // stop the recording
            releaseMediaRecorder(); // release the MediaRecorder object
            Toast.makeText(AndroidVideoCaptureExample.this, "Video captured!", Toast.LENGTH_LONG).show();

            Toast.makeText(AndroidVideoCaptureExample.this, vWidth+"BY"+vHeight, Toast.LENGTH_LONG).show();

            recording = false;
        } else {
            if (!prepareMediaRecorder()) {
                Toast.makeText(AndroidVideoCaptureExample.this, "Failed in prepareMediaRecorder()!\n - Ended -", Toast.LENGTH_LONG).show();
                finish();
            }
            // work on UiThread for better performance
            runOnUiThread(new Runnable() {
                public void run() {
                    // If there are stories, add them to the table
                    try {
                        mediaRecorder.start();

                    } catch (final Exception ex) {
                        // Log.i("---","Exception in thread");
                    }
                }
            });

            recording = true;
        }
    }
};


private void releaseMediaRecorder() {
    if (mediaRecorder != null) {
        mediaRecorder.reset(); // clear recorder configuration
        mediaRecorder.release(); // release the recorder object
        mediaRecorder = null;
        mCamera.lock(); // lock camera for later use
    }
}

private boolean prepareMediaRecorder() {

    List<Camera.Size> videosizes = mCamera.getParameters().getSupportedVideoSizes();
    Camera.Size videosize = videosizes.get(1);
    Camera.Size optimalVideoSize = getOptimalPreviewSize(videosize, desiredwidth, desiredheight);
    vWidth = optimalVideoSize.width;//mCamera.getParameters().getPreviewSize().width;
    vHeight = optimalVideoSize.height;//mCamera.getParameters().getPreviewSize().height;
    mediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
    mediaRecorder.setVideoEncodingBitRate(512* 1000);
    mediaRecorder.setVideoFrameRate(15);
    mediaRecorder.setVideoSize(optimalVideoSize.width, optimalVideoSize.height);
    mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
    mediaRecorder.setMaxDuration(600000); // Set max duration 60 sec.
    mediaRecorder.setMaxFileSize(50000000); // Set max file size 50M

    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        releaseMediaRecorder();
        return false;
    }
    return true;

}

private void releaseCamera() {
    // stop and release camera
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

private Camera.Size getOptimalPreviewSize(Camera.Size sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.2;
    double targetRatio = (double) w / h;
    if (sizes == null)
        return null;

    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
     Camera.Size size = sizes;

        Log.d("Camera", "Checking size " + size.width + "w " + size.height
                + "h");
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) <= ASPECT_TOLERANCE)
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }

    // Cannot find the one match the aspect ratio, ignore the
    // requirement
    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }

    }
    return optimalSize;
}
    public CameraPreview(Context context, Camera camera) {
    super(context);
    mCamera = camera;
    mHolder = getHolder();
    mHolder.addCallback(this);
    // deprecated setting, but required on Android versions prior to 3.0
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    try {
        // create the surface and start camera preview
        if (mCamera == null) {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        }
    } catch (IOException e) {
        Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage());
    }
}

public void refreshCamera(Camera camera) {
    if (mHolder.getSurface() == null) {
        // preview surface does not exist
        return;
    }
    // stop preview before making changes
    try {
        mCamera.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }
    // set preview size and make any resize, rotate or
    // reformatting changes here
    // start preview with new settings
    setCamera(camera);
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
        //startFaceDetection();
    } catch (Exception e) {
        Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage());
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.
    refreshCamera(mCamera);
}

public void setCamera(Camera camera) {
    //method to set a camera instance
    mCamera = camera;
    mCamera.setFaceDetectionListener(faceDetectionListener);
    startFaceDetection();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
     mCamera.release();
}

private Camera.FaceDetectionListener faceDetectionListener = new Camera.FaceDetectionListener() {

    @Override
    public void onFaceDetection(Camera.Face[] faces, Camera c) {

        if (faces.length > 0) {

            Log.d("FaceDetection", "face detected X and Y are as: " + faces.length +
                    " Face 1 Location X: " + faces[0].rect.centerX() +
                    "Y: " + faces[0].rect.centerY() +" LIES IN "+(MyDrawing.w-MyDrawing.radius) +"--"+(MyDrawing.w+MyDrawing.radius));

            if(faces[0].rect.centerX()>=0 && faces[0].rect.centerX()<115 )
            {
                Log.d("ALERT = ", "Detection Started" );
            }

        } else {
            Log.d("FaceDetection", "circle cordinates are as: " + (MyDrawing.w-MyDrawing.radius) +"cX"+ MyDrawing.radius+"cY");

        }
    }
};

public void startFaceDetection(){
    // Try starting Face Detection
    Camera.Parameters params = mCamera.getParameters();

    // start face detection only *after* preview has started
    if (params.getMaxNumDetectedFaces() > 0){
        // camera supports face detection, so can start it:
        mCamera.startFaceDetection();

    }
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开);
myContext=这个;
初始化();
Log.d(“面部检测”、“面部检测基线”);
}
专用int findFrontFacingCamera(){
int cameraId=-1;
//搜索前向摄像头
int numberOfCameras=Camera.getNumberOfCameras();
对于(int i=0;i