【问题标题】:Android Video Recording using Media Recorder is Not working使用 Media Recorder 进行 Android 视频录制不起作用
【发布时间】:2016-01-07 03:48:27
【问题描述】:

我正在尝试录制视频,但它在媒体录制开始和媒体录制准备时崩溃。请帮助我...这是我的代码...

private boolean startRecording() {
        camera.unlock();
        try {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
            @Override
            public void onError(MediaRecorder mr, int what, int extra) {
                Log.i(TAG, "Error");
            }
        });
            second=0;
            minute=0;
            recordCountTimer = new CountDownTimer(Long.MAX_VALUE,1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    second++;
                    if(second>=60){
                        second=0;
                        minute++;
                    }
                    recordCount.setText(String.format("%02d:%02d",minute,second));
                }

                @Override
                public void onFinish() {
                    finish();
                }
            }.start();
        mediaRecorder.setCamera(camera);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            Log.d(TAG, "A");
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
            Log.e(TAG, "B");
        mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
        defaultVideoPath= FileManger.getOutputMediaFile(MEDIA_TYPE_VIDEO).getAbsolutePath();
//        uriVid = Uri.parse(FileManger.getOutputMediaFile(MEDIA_TYPE_VIDEO).getAbsolutePath());
//        defaultVideoPath = getRealPathFromUri(uriVid);
        mediaRecorder.setOutputFile(defaultVideoPath);
        mediaRecorder.setVideoSize(recordingCameraSurface.getWidth(), recordingCameraSurface.getHeight());
        mediaRecorder.setVideoFrameRate(20);
            Log.v(TAG, "C");
        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setMaxFileSize(50000);
        mediaRecorder.prepare();
            Log.w(TAG, "D");
        mediaRecorder.start();
            Log.e(TAG, "E");
        } catch (IOException e) {
            releaseMediaRecorder();
            return false;
        }catch (IllegalStateException t){
            releaseMediaRecorder();
            return  false;
        }

        return true;
    }

它就像给予一样

RECORDER_OK﹕ B
MediaRecorder﹕ setOutputFormat called in an invalid state: 4

我将在这里进行下一个活动:

Intent intent  = new Intent(RecordBuyPage.this,CheckAndSaveActivity.class);
            intent.putExtra("VIDEOFILEPATH", defaultVideoPath);
            startActivity(intent);

在下一个活动中,我得到的路径为空:

 player.setDataSource(getIntent().getStringExtra("VIDEOFILEPATH"));

我认为我的调用媒体记录器的顺序是正确的,但它也遇到了麻烦:

 mediarecoreder.prepare().

请提供一些有效的解决方案,我从堆栈溢出中尝试了很多,但它没有工作....我认为视频没有录制,因为当我通过意图传递它时它正在采取 null...

【问题讨论】:

  • 你试过下面的答案吗?它解决了你的问题吗?

标签: android camera android-mediarecorder android-videoview video-recording


【解决方案1】:

希望你关注这个示例代码链接(Media Recorder) https://github.com/googlesamples/android-MediaRecorder

portrait 模式下record media 存在一些错误,因此要解决此问题,请遵循此link

在此链接中,您将获得您的media path,它位于stored,您可以轻松地将pass 发送到另一个activity。看看吧,希望对你有帮助。

要在stop capturing 上获取media 的路径,您可以在CaptureClick 方法上执行此操作

Log.d("Video file path", CameraHelper.getOutputMediaFile(
                        CameraHelper.MEDIA_TYPE_VIDEO).toString());

完成按钮OnClickListener

public void onCaptureClick(View view) {
        if (isRecording) {
            // BEGIN_INCLUDE(stop_release_media_recorder)

            // stop recording and release camera
            mMediaRecorder.stop();  // stop the recording
            releaseMediaRecorder(); // release the MediaRecorder object
            mCamera.lock();         // take camera access back from MediaRecorder

            // inform the user that recording has stopped
            setCaptureButtonText("Capture");
            isRecording = false;
            releaseCamera();
            Log.d("Video file path", CameraHelper.getOutputMediaFile(
                    CameraHelper.MEDIA_TYPE_VIDEO).toString());
            // END_INCLUDE(stop_release_media_recorder)

        } else {

            // BEGIN_INCLUDE(prepare_start_media_recorder)

            new MediaPrepareTask().execute(null, null, null);

            // END_INCLUDE(prepare_start_media_recorder)

        }
    }

请点击上面提供的这两个链接,它可能会解决您的问题。

【讨论】:

    【解决方案2】:

    试试这个

    public class VideoCapture extends Activity implements OnClickListener 
    ,SurfaceHolder.Callback {
    
    MediaRecorder recorder;
    SurfaceHolder holder;
    boolean recording = false;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    
        recorder = new MediaRecorder();
        initRecorder();
        setContentView(R.layout.main);
    
        SurfaceView cameraView = (SurfaceView) findViewById(R.id.CameraView);
        holder = cameraView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
        cameraView.setClickable(true);
        cameraView.setOnClickListener(this);
    }
    
    private void initRecorder() {
        recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    
        CamcorderProfile cpHigh = CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH);
        recorder.setProfile(cpHigh);
        recorder.setOutputFile("/sdcard/videocapture_example.mp4");
        recorder.setMaxDuration(50000); // 50 seconds
        recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
    }
    
    private void prepareRecorder() {
        recorder.setPreviewDisplay(holder.getSurface());
    
        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
            finish();
        } catch (IOException e) {
            e.printStackTrace();
            finish();
        }
    }
    
    public void onClick(View v) {
        if (recording) {
            recorder.stop();
            recording = false;
    
            // Let's initRecorder so we can record again
            initRecorder();
            prepareRecorder();
        } else {
            recording = true;
            recorder.start();
        }
    }
    
    public void surfaceCreated(SurfaceHolder holder) {
        prepareRecorder();
    }
    
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }
    
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recording) {
            recorder.stop();
            recording = false;
        }
        recorder.release();
        finish();
    }
    }
    
    
     Include Permissions in Manifest file :
    
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多