根据Android SDK MediaRecorder.setCamera 可用于回收现有相机实例进行视频采集和预览,无需重置预览。我找不到任何样本,我所有的尝试都是徒劳的:我要么得到错误的状态异常,要么 MediaRecorder.prepare 失败。
- 有谁知道这种方法是否可用?
- 那我该怎么用呢?
- 网络上有任何可用的示例吗?
根据Android SDK MediaRecorder.setCamera 可用于回收现有相机实例进行视频采集和预览,无需重置预览。我找不到任何样本,我所有的尝试都是徒劳的:我要么得到错误的状态异常,要么 MediaRecorder.prepare 失败。
我遇到了同样的问题,并发现了它是如何工作的。有些事情必须正确地完成。首先,您应该检查 android 文档中的状态图。
命令的工作顺序如下。
mCamera = Camera.open();
rec = new MediaRecorder(); // state "Initial"
mCamera.lock();
mCamera.unlock();
rec.setCamera(mCamera); // state still "Initial"
rec.setVideoSource(MediaRecorder.VideoSource.CAMERA); // state "Initialized"
rec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // state "DataSourceConfigured"
rec.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
rec.setPreviewDisplay(surfaceHolder.getSurface());
rec.setOutputFile(Environment.getExternalStorageDirectory() + "/test.mp4");
rec.prepare(); // state "Prepared"
rec.start(); // state "Recording"
// ...
rec.stop(); // state "Initial"
一个完整的例子可以在这里找到。
The Android Camera app source provides the best example. After some investigation, I discovered that recorder.setCamera(camera)
should be called immediately after instantiation of the MediaRecorder
, or at least before any settings are applied to it. Applying any settings (setVideoSource()
, etc.) before calling setCamera()
results in an error.
我从@lyron 那里得到了提示。
首先,打开前置摄像头。
int cameraId = -1;
int camNums = Camera.getNumberOfCameras();
for( int i = 0 ; i < camNums ; i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if( info.facing == CameraInfo.CAMERA_FACING_FRONT ) {
cameraId = i;
break;
}
}
mCamera = Camera.open(cameraId);
mCamera.unlock();
我需要如上所述使用前置摄像头。
并且不要忘记解锁相机。
如果不这样做,您将在下面看到错误。
E/MediaRecorder(15509): start failed: -19
E/SampleVideoRecorder(15509): Exception :
E/SampleVideoRecorder(15509): java.lang.RuntimeException: start failed.
E/SampleVideoRecorder(15509): at android.media.MediaRecorder.start(Native Method)
其次,在设置其他相机之前先设置相机。
recorder = new MediaRecorder();
recorder.setCamera( mCamera ); // like this!
recorder.setAudioSource( MediaRecorder.AudioSource.MIC);
recorder.setVideoSource( MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoSize( 2560, 1440 );
recorder.setVideoFrameRate(30);
recorder.setPreviewDisplay(holder.getSurface());
recorder.setOutputFile( s_dir );
try {
recorder.prepare();
recorder.start();
} catch( Exception e ) {
Log.e("SampleVideoRecorder", "Exception : ", e );
recorder.release();
recorder = null;
}
有人说setCamera() 应该在 prepare() 之前调用。
但我正在看我的代码正在运行。
创建 mediarecorder 实例后,您是否尝试过使用以下功能?
//解锁相机以允许另一个进程访问它。
mCameraDevice.unlock();
//设置用于录制的相机。使用此功能可在预览和//捕获模式之间快速切换,而无需拆卸相机对象。
mMediaRecorder.setCamera(mCameraDevice);
我启动了 MediaRecorder:
MediaRecorder mediaRecorder = null;
但不是这样:
MediaRecorder mediaRecorder = new MediaRecorder();
(headbang)哈哈..现在我的问题是预览的kalydascope..是时候搜索互联网了..
希望这对某人有所帮助。
我发现了 2 个您可能会觉得有用的链接。Android Camera git repo和MediaRecorder 示例