【问题标题】:Can't set video quality for media recorder.video produces flickering video无法为媒体记录器设置视频质量。视频会产生闪烁的视频
【发布时间】:2014-06-05 08:23:33
【问题描述】:
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 相机拍摄的视频不同,我使用媒体记录器录制的视频与原生视频相比质量较差,我该如何提高视频质量。

如果有人知道,请帮帮我。谢谢

【问题讨论】:

    标签: android android-mediarecorder surfaceholder


    【解决方案1】:

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

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

    然后当你调用mediaRecorder.start() 时,它要么崩溃,要么死机,要么显示垃圾。

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

    1. 停止相机预览,
    2. 移除其预览表面
    3. 将摄像头分配给 MediaRecorder(使用 setCamera
    4. 将 MediaRecorder 设置为您需要的质量
    5. 然后重新附加预览表面

    然后,当您开始录制时,一切正常。

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

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

    然后再往下,做你的

    mRecorder.setCamera()

    这就是我的解决方案。我现在可以将视频质量设置为 720p(或 1080p)并且效果很好。

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

    你可能需要恢复你的

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

    恢复到之前的状态,然后重新开始实际预览。

    我希望它也对你有用:)

    【讨论】:

    【解决方案2】:

    备选方案一

    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);
    

    【讨论】:

    • 感谢回复,但它不起作用。我已更新我的代码,请检查。
    【解决方案3】:

    替换此代码:

        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    

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

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

    与:

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

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2022-06-19
      相关资源
      最近更新 更多