setOutputFormat called in an invalid state: 1

在编写一个简单的录像应用程序的时候,爆出如下异常:

E MediaRecorder: setOutputFormat called in an invalid state: 1
E AndroidRuntime: java.lang.IllegalStateException
E AndroidRuntime: at android.media.MediaRecorder.setOutputFormat(Native Method)


因为code是完全按照google的Demo写的,觉得比较奇怪。

看描述是说setOutputFormat的时候,状态应该错乱了,最后又看了一下google文档,原因在于google对于设定MediaRecorder是有要求的:


所以在写代码的时候应该完全按照人家要求的设定顺序来写,具体如下:

    	mCamera.unlock();
    	mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
    	
    	//1st. Initial state
    	mMediaRecorder = new MediaRecorder();
    	mMediaRecorder.setCamera(mCamera);
    	
    	//2st. Initialized state
    	mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    	mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    	
    	//3st. config
        mMediaRecorder.setOutputFormat(mProfile.fileFormat);
        mMediaRecorder.setAudioEncoder(mProfile.audioCodec);
        mMediaRecorder.setVideoEncoder(mProfile.videoCodec);
        mMediaRecorder.setOutputFile("/sdcard/FBVideo.3gp");
        mMediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight);
        mMediaRecorder.setVideoFrameRate(mProfile.videoFrameRate);
        mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate);
        mMediaRecorder.setAudioEncodingBitRate(mProfile.audioBitRate);
        mMediaRecorder.setAudioChannels(mProfile.audioChannels);
        mMediaRecorder.setAudioSamplingRate(mProfile.audioSampleRate);

    	
    	mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
    	
    	try {
			mMediaRecorder.prepare();
			mMediaRecorder.start();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


这个异常通常出现在使用 AndroidMediaRecorder 录制音视频时。这个异常的原因可能有很多种,比如权限问题、设备不支持等。 以下是一些可能的解决方法: 1. 确保你的应用已经获取了录音权限和存储权限(如果需要保存录音文件)。可以在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 确保你的设备支持录制音视频,可以在代码中使用以下方法检查: ```java if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE) || !getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { // 设备不支持录制音视频 return; } ``` 3. 确保你已经正确设置了 MediaRecorder 的参数,比如音频来源、输出格式等。可以参考以下代码: ```java mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mMediaRecorder.setOutputFile(mFileName); ``` 4. 如果你在录制音视频前已经使用了其他的音频或视频播放器,可能需要先释放这些资源,可以尝试调用以下方法: ```java mMediaPlayer.release(); mMediaPlayer = null; ``` 如果以上方法都没有解决问题,你可以尝试搜索其他的解决方法,或者在 Stack Overflow 上提问。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值