在我的视频捕获活动中调用stop()
时,有时软件会挂起并且无法恢复。只有通过点击“返回”触发ANR才能让我终止活动。
在日志中,我看到以下行被一遍又一遍地重复:
W/CameraSource(YYYYY): 等待传入摄像机视频帧超时:XXXXXX微秒
其他人有没有看到过这种行为?有什么解决方法吗?
在我的视频捕获活动中调用stop()
时,有时软件会挂起并且无法恢复。只有通过点击“返回”触发ANR才能让我终止活动。
在日志中,我看到以下行被一遍又一遍地重复:
W/CameraSource(YYYYY): 等待传入摄像机视频帧超时:XXXXXX微秒
其他人有没有看到过这种行为?有什么解决方法吗?
我曾经也遇到过这个问题,因为在执行stop()函数之前,我先释放了相机。这也解释了错误信息“Timed out waiting for incoming camera video frames”。原因是等待已经被释放的相机。 确保先停止录制器,然后再释放相机:
mMediaRecorder.stop();
mMediaRecorder.release();
camera.stopPreview();
camera.release();
captureButton.setText("start");
我已将其注释掉,停止mediarecorder不再导致ANR。我的做法是,而不是改变按钮的文本,我只是改变了背景。
captureButton.setBackgroundResource(R.drawable.icon_post_camera_record_main);
没有看到您的代码,我不确定我们是否遇到了相同的问题,但这个解决方法修复了我的问题。我仍在寻找为什么对于settext()会发生这种情况而对于setBackgroundResource不会发生。我猜测这与背景/异步任务有关,但这仅是一个猜测。
camera.startPreview();
camera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOutputFile(output.getAbsolutePath());
recorder.setPreviewDisplay(holder.getSurface());
recorder.prepare();
recorder.start();
camera.stopPreview();
Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setPreviewSize(x, y);
camera.setParameters(cameraParameters);
camera.startPreview();
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
camera.lock();
camera.stopPreview();
实际上,录制开始后更改预览大小的原因很复杂且与领域有关,因此我将保存细节。 但是,重点是一样的:您无法在停止它之前更改预览大小,但是在媒体记录器启动后无法停止预览。 我相信还有其他可能导致这种情况发生的问题,例如任何其他摄像机参数。
您应该确保在录制视频时不要干扰摄像头。
stop()
方法阻塞,您的应用程序也不会被卡住。 new Thread("STOP_RECORDER") {
public void run() {
Log.d(TAG, "Stopping recorder...");
mediaRecorder.stop();
Log.d(TAG, "Recorder successfully stopped");
}
}.start();
我遇到了同样的问题,我找到的解决方案是在相机设置到MediaRecorder之前添加mCamera.lock(); right before mCamera.unlock();。
可能你正在onCreate()中开始预览和媒体录制初始化。将其移动到稍后的时间点或添加new Handler.postDelayed(runnable, 1000);
Activity.onStop
上停止录制,当我将调用MediaRecorder.stop
移动到Activity.onPause
时,问题得到了解决。看看这个 -
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
releaseMediaRecorder();
releaseCamera();
}
private void releaseMediaRecorder(){
if (recorder != null) {
recorder.reset(); // clear recorder configuration
recorder.release(); // release the recorder object
recorder = null;
camera.lock(); // lock camera for later use
}
}
private void releaseCamera(){
if (camera != null){
camera.release(); // release the camera for other applications
camera = null;
}
}
public void stopRecording() { // Toast.makeText(this,"Inside the stop recording",Toast.LENGTH_SHORT).show();
// camera.unlock();
recorder.stop();
// recorder.reset();
recorder.release();#release the recorder after stop important.
}