无法为媒体记录器设置视频质量。视频会产生闪烁的视频

时间:2014-06-05 08:23:33

标签: android android-mediarecorder surfaceholder

mMediaRecorder = new MediaRecorder();
    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);
    // Step 2: Set sources
    // activate this for recording with sound\

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mMediaRecorder.setVideoSize(getMaxSupportedVideoSize().width,getMaxSupportedVideoSize().height);

    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));

    // Step 4: Set output file
    mMediaRecorder.setOutputFile(getOutputMediaFile("movie"));


    // Step 5: Set the preview output
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    mMediaRecorder.setOrientationHint(90);

上面的代码工作正常但是,视频的质量与我在原生Android相机拍摄的视频不一样,我使用媒体录像机录制的视频质量比原生录像机差,我怎样才能提高视频质量。

如果有人知道帮助我。谢谢

3 个答案:

答案 0 :(得分:2)

我不是Java / Android开发人员,我正在使用Xamarin和C#,但我遇到了同样的问题,我的解决方案应该直接适用(即使语法几乎相同)。

我发现如果您正在使用setCamera(并且在启动mediaRecorder之前预览相机所看到的内容),那么它将不允许您更改mediaRecorder上的质量设置。

然后当你拨打mediaRecorder.start()时,它会崩溃或冻结或显示垃圾。

基本上,只要相机正在预览,就不允许MediaRecorder以与相机已有的质量不同的质量开始录制。你需要

  1. 停止相机预览,
  2. 带走其预览表面
  3. 将相机分配给MediaRecorder(使用setCamera
  4. 以您需要的质量设置MediaRecorder
  5. 然后重新附加预览表面
  6. 然后当你开始录制时,一切正常。

    因此,就您而言,在致电mediaRecorder.setCamera()之前,请尝试以下方法:

    mCamera.stopPreview(); mCamera.setPreviewDisplay(null);

    然后再往下,做你的

    mRecorder.setCamera()

    这是我的解决方案。我现在可以将视频质量设置为720p(或1080p),它可以完美运行。

    但是,当您停止录制时,预览也将停止。

    您可能需要恢复

    mCamera.setPreviewDisplay(mPreview.getHolder().getSurface())

    到之前的状态,然后重新启动实际预览。

    我希望它也适合你:)

答案 1 :(得分:1)

备选方案1

recorder.setVideoSize(640, 480);
recorder.setVideoFrameRate(16); //might be auto-determined due to lighting
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// MPEG_4_SP
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

备选方案2

CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cpHigh);

答案 2 :(得分:1)

替换此代码:

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

mMediaRecorder.setVideoSize(getMaxSupportedVideoSize()宽度,getMaxSupportedVideoSize()高度);

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

with:

    mMediaRecorder.setProfile(CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH));