我正在制作一个自定义视频录制课程,我在使用“活动”第一次出现时让相机预览显示出来时遇到了一些问题。我在surfaceCreated
回调中调用了这个函数:
private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if(camera == null) {
camera = Camera.open();
camera.unlock();
}
if(recorder == null)
recorder = new MediaRecorder();
recorder.setPreviewDisplay(surface);
recorder.setCamera(camera);
camera.startPreview();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(15000000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// This is thrown if the previous calls are not called with the
// proper order
e.printStackTrace();
}
}
活动开始时,我的应用程序崩溃说:
java.lang.RuntimeException: startPreview failed
在错误之上,我注意到一句话:
attempt to use a locked camera from a different process (old pid 4894, new pid 6405)
当我单步执行代码时,camera.startPreview()
行发生了错误。如果我从代码中删除该行,则在我调用recorder.start()
后预览显示正常,在此之前我只有一个带有记录按钮的黑屏。一旦我停止录制,预览继续显示正常(我在停止录制后呼叫camera.startPreview()
)。
由于我在开始预览之前只调用了camera.unlock()
几行,并且两个调用都出现在同一个函数中,我怎么能出现这个错误?
编辑:我测试了相同的代码,减去了对Droid X2和Droid 1上startPreview()
的调用,它运行正常。看起来EVO 4G就是问题所在。我会继续调查。
答案 0 :(得分:0)
排列这样的代码并降低视频编码率。视频大小非常高。这可能不会在您的设备上造成问题,因为在某些设备上它会被内部剪裁。
private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if (camera == null) {
camera = Camera.open();
camera.unlock();
}
if (recorder == null)
recorder = new MediaRecorder();
recorder.setCamera(camera);
camera.startPreview();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(2048000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setPreviewDisplay(surface);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// This is thrown if the previous calls are not called with the
// proper order
e.printStackTrace();
}
}
答案 1 :(得分:0)
我在这里回答了一个非常相似的问题:preview display in android media recorder
看看它是否对您有所帮助,它有一个完整的活动,可用于预览并录制视频。
答案 2 :(得分:0)
camera.unlock()
必须从之前锁定相机的同一线程中调用。检查您的日志中是否有Unlock call from pid 19322; currently locked to pid 17652
之类的消息。
请注意,可以通过调用Camera.lock()
或MediaRecorder.start()
自API级别14开始,相机自动锁定 MediaRecorder.start()。应用程序可以使用相机(例如:变焦) 录制开始后。录制后无需调用此 开始或停止。