2015-08-28 404 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