gpt4 book ai didi

java - MediaRecorder 在 android 上开始视频捕捉的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:20 25 4
gpt4 key购买 nike

我正在尝试开发一款可以录制用户视频的应用程序。所以我需要用前置摄像头拍摄视频(如果有的话)。我构建了一个相机预览,效果很好。我使用 Android 操作方法网站构建了一个 MediaRecorder 并进行了设置。如果我使用 CamcorderProfile,我的媒体服务器会在我调用 start() 时死机。如果我自己设置编码器,媒体服务器会在 start() 处抛出运行时异常,并显示消息“start failed: -19”我在这里发现了一些关于这个话题的问题,但没有一个能解决我的问题。我认为这可能与我没有使用后置摄像头有关。也许我没有找到合适的纪录片来构建合适的代码。我认为这不仅仅是我的问题,我很乐意获得更多关于相机使用的知识。我的代码如下:

设置预览的onResume()

protected void onResume() {
super.onResume();
// 1. set up camera preview
if(checkCameraHardware(this)){
mCamera = getCameraInstance();
mCameraPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(id.cameraPreview);
preview.addView(mCameraPreview);
}
else{
Log.d("Recorder", "camera check returned false");
}
}

使用的方法checkCameraHardware()

private boolean checkCameraHardware(Context context){
boolean ret = true;
if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
ret = true;
}
else {
ret = false;
}
return ret;
}

和方法 getCameraInstance()

public static Camera getCameraInstance(){
Camera c = null;
int cnum = 0;
mCamSelect = 0;
Camera.CameraInfo caminfo = new CameraInfo();
try {
cnum = Camera.getNumberOfCameras();
Log.d("getCameraInstance", String.valueOf(cnum));
for(int i = 0;i<cnum;i++){
Camera.getCameraInfo(i, caminfo);
if(caminfo.facing == CameraInfo.CAMERA_FACING_FRONT){
mCamSelect = i;
break;
}
}
c = Camera.open(mCamSelect); // attempt to get a Camera instance
}
catch (Exception e){
Log.d("getCameraInstance", "FATAL camera could not be opened");
// Camera is not available (in use or does not exist)
}
if(c==null)Log.d("getCameraInstance", "no camera returned");
return c; // returns null if camera is unavailable
}

此代码 fragment 显示错误出现的位置(在 onClick 回调中)

if(prepareVideoRecorder()){
mMediaRecorder.start(); //here the errors occure
recording = true;
//start recording
}

以及三个MediaRecorder相关的方法:prepareVideoRecorder()、releaseMediaRecorder()和release Camera()

private void releaseMediaRecorder(){
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
mCamera.lock(); // lock camera for later use
}
}

private void releaseCamera(){
if (mCamera != null){
mCamera.release(); // release the camera for other applications
mCamera = null;
}
}

private boolean prepareVideoRecorder(){

//ex: mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();

// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);

// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)


CamcorderProfile profile = CamcorderProfile.get(mCamSelect, CamcorderProfile.QUALITY_HIGH);
if(profile == null){Log.d(tag, "the camcorder profile instance is null");

mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
}else{
mMediaRecorder.setProfile(profile);
}



// Step 4: Set output file
//ex: mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());
mMediaRecorder.setOutputFile(currentVidFile.getAbsolutePath());

// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(mSlideview.getHolder().getSurface());

// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(tag, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(tag, "IOException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
}
return true;
}

public void onGesturePerformed(GestureOverlayView arg0, Gesture arg1) {
// TODO Auto-generated method stub

}

最佳答案

我正在回答我自己的问题,以帮助遇到同样问题的每个人。这个错误太愚蠢了,承认它有点尴尬。

在准备音视频源上我犯了错误的表面。

我有不同的 SurfaceView,并将错误的 SurfaceView 的表面提交给 MediaRecorder。这导致尝试将两个不同的源连接到表面,这是不可能的,并导致媒体服务器关闭。

我在 GalaxyPad 10.1 上测试了我的应用程序,视频录制工作正常。我在 Dalvik VM 上测试了该应用程序,视频是黑白的,但也能正常工作。

希望对您有所帮助。

关于java - MediaRecorder 在 android 上开始视频捕捉的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com