安卓系统中的视频质量如何?

6

我正在使用媒体记录器类来录制视频,我使用以下属性初始化记录器:

    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

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

但是使用媒体录制器录制的视频质量不如我使用本机Android相机拍摄的视频,与原生相机相比,我的视频质量很差,我该如何提高视频质量。

如果有人知道,请帮忙解决。谢谢。

5个回答

12

最终我找到了在Android 2.1中记录高质量视频的代码,通过设置videEncodingBitRate、AudioEncodingBitRate、AudioSamplingRate等参数来实现。使用此方法,您可以根据需要设置视频属性,以提供高质量视频。

要设置高质量和低质量参数,请参考此页面。

http://www.andgps.com/20110410/camcorderprofile-predefined-camcorder-profile-settings-for-camcorder-applications

我使用基础版本的Android 2.1所使用的代码以生成高质量视频如下所示:

    recorder = new MediaRecorder();
    Method[] methods = recorder.getClass().getMethods();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setVideoFrameRate(24);
    recorder.setVideoSize(720, 480);

    for (Method method: methods){
    try{
        if (method.getName().equals("setAudioChannels")){
                method.invoke(recorder, String.format("audio-param-number-of-channels=%d", 1));
        } 
        else if(method.getName().equals("setAudioEncodingBitRate")){
                method.invoke(recorder,12200);
            }
        else if(method.getName().equals("setVideoEncodingBitRate")){
            method.invoke(recorder, 3000000);
        }
        else if(method.getName().equals("setAudioSamplingRate")){
            method.invoke(recorder,8000);
        }
        else if(method.getName().equals("setVideoFrameRate")){
            method.invoke(recorder,24);
        }
    }catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (IllegalAccessException e) {

        e.printStackTrace();
    } catch (InvocationTargetException e) {

        e.printStackTrace();
    }
    }

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

`


1
我在这一行method.invoke( recorder, String.format( "audio-param-number-of-channels=%d", 1 ) );上得到了Method android.media.MediaRecorder.setAudioChannels argument 1 has type int, got java.lang.String的错误信息。有什么想法吗?编辑:我将其更改为if ( method.getName().equals( "setAudioChannels" ) ) method.invoke( recorder, 1 );,然后它就可以工作了。不确定这是否是一个好的解决方案。**编辑:现在我得到了E/MediaRecorder﹕ start failed: -19的错误信息。 - Jonas Borggren
在我的(API 24)三星S6上运行得非常好。 - Charlie Dalsass

4
请使用以下设置进行视频录制:-
private void cameraSettings()
{
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
    mediaRecorder.setVideoSize(width, height);
    mediaRecorder.setVideoFrameRate(videoFramePerSecond);
}

使用视频帧速率 = 30,宽度 = 1280,高度 = 720。您可以按照自己的要求进行此设置。


请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本:如果您发现此答案合适,请接受它,以便其他人也可以受益。谢谢。 - Balban

2
尝试一下。

mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mrec.setPreviewDisplay(surfaceHolder.getSurface());


0

尝试添加这行代码

 recorder.setVideoSize(640,480); 

或者检查您的设备支持的屏幕分辨率,并相应地设置最佳分辨率。


0
为了提高视频质量,您应该考虑将媒体记录器实例的视频大小设置为设备的最大分辨率。
这段代码可以完成任务。
WindowManager wm = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
Point size = new Point();
wm.getDefaultDisplay().getRealSize(size);

mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setOutputFile(file.toString());
mMediaRecorder.setVideoEncodingBitRate(10000000);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.HEVC);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoSize(size.y, size.x);
int rotation =getWindowManager().getDefaultDisplay().getRotation();
switch (mSensorOrientation) {
    case SENSOR_ORIENTATION_DEFAULT_DEGREES:
        mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
        break;
    case SENSOR_ORIENTATION_INVERSE_DEGREES:
        mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
        break;
}
mMediaRecorder.prepare();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接