2015-08-28 154 views
-1

我正在使用此活动在我的应用程序中录制视频。当我运行这段代码,我得到以下错误:Android - MediaRecorder启动失败:RuntimeException

Video dimension (1600x1200) is unsupported. 
E/MediaRecorder﹕ start failed: -19 
... 
Caused by: java.lang.RuntimeException: start failed. 

我已指定清单中的以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.RECORD_VIDEO" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.STORAGE" /> 

这里是活动本身:

public class CameraActivity extends Activity { 

private Camera mCamera; 
private SurfaceView mPreview; 
private MediaRecorder mMediaRecorder; 
private boolean isRecording = false; 
private static final String TAG = "Recorder"; 
private Button captureButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mPreview = (SurfaceView) findViewById(R.id.surface_view); 
    captureButton = (Button) findViewById(R.id.button_capture); 
} 

public void onCaptureClick(View view) { 
    if (isRecording) { 
     mMediaRecorder.stop(); 
     releaseMediaRecorder(); 
     mCamera.lock(); 
     setCaptureButtonText("Capture"); 
     isRecording = false; 
     releaseCamera(); 
    } else { 
     new MediaPrepareTask().execute(null, null, null); 
    } 
} 

private void setCaptureButtonText(String title) { 
    captureButton.setText(title); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    releaseMediaRecorder(); 
    releaseCamera(); 
} 

private void releaseMediaRecorder() { 
    if (mMediaRecorder != null) { 
     mMediaRecorder.reset(); 
     mMediaRecorder.release(); 
     mMediaRecorder = null; 
     mCamera.lock(); 
    } 
} 

private void releaseCamera() { 
    if (mCamera != null) { 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
private boolean prepareVideoRecorder() { 
    mCamera = CamHelper.getDefaultCameraInstance(); 
    Camera.Parameters parameters = mCamera.getParameters(); 
    List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); 
    Camera.Size optimalSize = CamHelper.getOptimalPreviewSize(mSupportedPreviewSizes, 
      mPreview.getWidth(), mPreview.getHeight()); 
    CamcorderProfile profile = CamcorderProfile.get(Camera.CameraInfo.CAMERA_FACING_FRONT, CamcorderProfile.QUALITY_HIGH); 
    profile.videoFrameWidth = optimalSize.width; 
    profile.videoFrameHeight = optimalSize.height; 

    parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight); 
    mCamera.setParameters(parameters); 
    try { 
     mCamera.setPreviewDisplay(mPreview.getHolder()); 
    } catch (IOException e) { 
     Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage()); 
     return false; 
    } 


    mMediaRecorder = new MediaRecorder(); 

    mCamera.unlock(); 
    mMediaRecorder.setCamera(mCamera); 

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

    mMediaRecorder.setProfile(profile); 

    mMediaRecorder.setOutputFile("/sdcard/schickn_sample.mp4"); 

    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; 
} 

class MediaPrepareTask extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    protected Boolean doInBackground(Void... voids) { 
     if (prepareVideoRecorder()) { 
      mMediaRecorder.start(); 
      isRecording = true; 
     } else { 
      releaseMediaRecorder(); 
      return false; 
     } 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (!result) { 
      CameraActivity.this.finish(); 
     } 
     setCaptureButtonText("Stop"); 

    } 
} 

最小的Api版本设置为11.我已经查看了网络上有关同一问题的其他几个问题,但是没有一个解决方案适用于我。我曾尝试:

https://stackoverflow.com/a/20388192/3011902

但它并没有解决异常。

回答

0

由于错误信息

Video dimension (1600x1200) is unsupported.

我假设你做一些错误的参数。尝试将其设置为默认值或更改值以解决问题。

Camera.Parameters parameters = mCamera.getParameters(); 
    List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); 
    Camera.Size optimalSize = CamHelper.getOptimalPreviewSize(mSupportedPreviewSizes, 
      mPreview.getWidth(), mPreview.getHeight()); 
    CamcorderProfile profile = CamcorderProfile.get(Camera.CameraInfo.CAMERA_FACING_FRONT, CamcorderProfile.QUALITY_HIGH); 
    profile.videoFrameWidth = optimalSize.width; 
    profile.videoFrameHeight = optimalSize.height; 
+0

所以你建议我省略那段代码? – TastyLemons

+0

我还没有使用mediaRecorder,不知道你是否需要它们,但是是试试还是改变宽度和高度。这里是API说明:http://developer.android.com/reference/android/media/MediaRecorder.html – Simon

+0

确定它不再崩溃,当我删除该代码,但现在录音被拉伸。 – TastyLemons

相关问题