Android MediaRecorder 不是每次都初始化

时间:2021-03-08 04:22:13

标签: android surfaceview mediarecorder

我正在尝试使用 Android Media Recorder 记录持久 Surface,我的代码有时可以正常工作,但大多数情况下,在调用媒体记录器类的 .prepare() 方法后,我得到了 Io 异常.. 我尝试更改视频编解码器、帧速率和许多其他内容,但我找不到它的解决方案.. 我花了 2 天的时间来解决这个问题,并且仍在寻找 .. 如果有人遇到同样的问题,请回复 .. 任何形式的帮助都是非常可观的

这是用于初始化记录器的代码

   public void initRecorder(File saveToFile, int displayWidth, int displayHeight,
                             int desiredWidth, int desiredHeight, int orientationHint,
                             MediaRecorder.OnErrorListener errorListener,
                             MediaRecorder.OnInfoListener infoListener)
            throws IOException {

        if(mMediaRecorder==null)
        {
            MediaRecorder mediaRecorder = new MediaRecorder();

            mediaRecorder.setOnInfoListener(infoListener);

            mediaRecorder.setOnErrorListener(errorListener);

            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            if(mSurface==null)
            {
                Log.d("Surface_test>>","Surface Is  Null");

            }else {
                Log.d("Surface_test>>","Surface Is NOT >>>>>>>>>>. Null");
                mediaRecorder.setInputSurface(mSurface);
            }
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            mediaRecorder.setAudioSamplingRate(44100);
            mediaRecorder.setAudioEncodingBitRate(96000);

            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

            mediaRecorder.setVideoEncodingBitRate(12000000);
            mediaRecorder.setVideoFrameRate(30);

            if(desiredWidth > desiredHeight){
                float desiredAspect = 1080.0f / 2280.0f;

                if(desiredWidth > 2280 || desiredHeight > 1080){
                    float aspect = (float) desiredHeight / desiredWidth;
                    if(aspect > desiredAspect){
                        desiredHeight = 1080;
                        desiredWidth = (int) Math.floor(desiredHeight / aspect);
                    } else {
                        desiredWidth = 2280;
                        desiredHeight = (int) Math.floor(desiredWidth * aspect);
                    }
                }
            } else {
                float desiredAspect = 2280.0f / 1080.0f;

                if(desiredWidth > 1080 || desiredHeight > 2280){
                    float aspect = (float) desiredHeight / desiredWidth;
                    if(aspect > desiredAspect){
                        desiredHeight = 2280;
                        desiredWidth = (int) Math.floor(desiredHeight / aspect);
                    } else {
                        desiredWidth = 1080;
                        desiredHeight = (int) Math.floor(desiredWidth * aspect);
                    }
                }
            }
            

             mediaRecorder.setVideoSize(mDesiredHeight, mDesiredWidth);

             mediaRecorder.setOrientationHint(orientationHint);

            Log.d("Recording_Debug>>","File Path>>"+saveToFile.getAbsolutePath());
            mediaRecorder.setOutputFile(saveToFile.getAbsolutePath());

            try {
                mediaRecorder.prepare();
            }catch (Exception e)
            {
                Log.d("Recording_Debug>>",e.toString());
            }
            mMediaRecorder = mediaRecorder;
        }else {
            Log.d("Recording_Debug","ALreday Initialized");
        }

    }

尝试一些方法,我发现当我在下面评论时

mediaRecorder.setVideoSize(mDesiredHeight, mDesiredWidth); 

我可以录制视频,但其纵横比不正确

我使用硬编码的维度,如

 mediaRecorder.setVideoSize(640, 480);

这也不起作用

0 个答案:

没有答案