【问题标题】:Video quality in android?Android中的视频质量?
【发布时间】:2011-06-21 11:47:22
【问题描述】:

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

    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 android-layout android-mediarecorder


    【解决方案1】:

    最后我通过设置 videEncodingBitRate 、 AudioEncodingBitRate 、 AudioSamplingRate ...等找到了在 android 2.1 中录制高质量视频的代码。使用此方法,您可以设置任何您想要提供高质量视频的视频属性。

    关于设置高质量和低质量参数,请参阅此页面,

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

    `

    【讨论】:

    • 我在这一行得到Method android.media.MediaRecorder.setAudioChannels argument 1 has type int, got java.lang.String method.invoke( recorder, String.format( "audio-param-number-of-channels=%d", 1 ) );。知道为什么吗?编辑:我将其更改为 if ( method.getName().equals( "setAudioChannels" ) ) method.invoke( recorder, 1 ); 并且有效。不确定这是否是一个好的解决方案。 **编辑:我现在得到E/MediaRecorder﹕ start failed: -19 ..
    • 在我的 (API 24) 三星 S6 上运行良好。
    【解决方案2】:

    对视频录制使用以下设置:-

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

    使用 videoFramePerSecond = 30 和宽度 = 1280 和高度 = 720.. 此设置您可以根据需要自行设置。

    【讨论】:

    • 如果你觉得这个答案合适。请接受这一点,以便其他人可以利用这一点。谢谢
    【解决方案3】:

    试试这个

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

    【讨论】:

      【解决方案4】:

      尝试添加这一行

       recorder.setVideoSize(640,480); 
      

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

      【讨论】:

        【解决方案5】:

        要提高视频质量,您应该考虑将 mediaRecorder 实例上的视频大小设置为设备的最大分辨率。

        这个 sn-p 将完成这项工作

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

        【讨论】:

          猜你喜欢
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多