在Android媒体录制器中预览显示

时间:2013-10-04 08:28:41

标签: android surfaceview android-mediarecorder

在android中如何在媒体录制器启动之前显示预览面。 我的应用程序具有视频录制功能,当我导航到视频录制片段时,它显示黑屏,当我开始使用启动按钮进行录制时,相机预览显示和录制开始。

如何在录制前开始预览。 我添加了我在片段的onCreateView()中使用的代码 -

surfaceHolder = mySurfaceView.getHolder();
camera = Camera.open();
if(camera!=null){
    camera.setDisplayOrientation(90);
    Camera.Parameters param;
    param = camera.getParameters();
    param.setPreviewFrameRate(20);
    param.setPreviewSize(176, 144);
    camera.setParameters(param);
    camera.setPreviewDisplay(surfaceHolder);
}

mediaRecorder = new MediaRecorder();
camera.unlock();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile camcorderProfile_HQ = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(camcorderProfile_HQ);
String filePath = getOutputMediaFile(MEDIA_TYPE_VIDEO).getPath();
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);
mediaRecorder.setOutputFile(filePath);

以及我在开始按钮上使用的代码 -

mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.prepare();
mediaRecorder.start();

所以我可以使用上面的代码重新编码视频,但无法在录制开始前显示预览。 请在我失踪的地方帮助我。因为在重新录制视频之前会显示黑屏。

提前致谢。

2 个答案:

答案 0 :(得分:4)

public void surfaceCreated(SurfaceHolder holder) {
        if (mCamera != null) {
            Parameters params = mCamera.getParameters();
            mCamera.setParameters(params);
            try {
                //mCamera.setDisplayOrientation(90);
                mCamera.setPreviewDisplay(holder);
            } catch (IOException e) {
                e.printStackTrace();
            }
            mCamera.startPreview();
        }
    }

如果实现SurfaceHolder.Callback,请像这样覆盖surfaceCreated方法。这对我有用。

答案 1 :(得分:3)

我遇到了同样的问题。我查了一下,这是我的活动。我花了一些力气让它不崩溃,所以这是最终的结果。它在用户单击REC按钮之前显示预览。 (我也在展示倒计时,但不要介意)。另请注意,在此示例中,主线程上的工作量太大(单击时)。这里有一些不是最好的做法,但对于一个工作的例子,我认为它已经足够好了。

public string ObfuscateEmail(string email)
{
    var displayCase = email;

    var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value;
    if (partToBeObfuscated.Length - 3 > 0) {
        var obfuscation = "";
        for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*";
        displayCase = String.Format("{0}{1}{2}{3}",  displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1));
    } else if (partToBeObfuscated.Length - 3 == 0) {
        displayCase = String.Format("{0}*{1}", displayCase[0], displayCase.Substring(2));
    }

    return displayCase;
}