-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
但它並沒有解決異常。
所以你建議我省略那段代碼? – TastyLemons
我還沒有使用mediaRecorder,不知道你是否需要它們,但是是試試還是改變寬度和高度。這裏是API說明:http://developer.android.com/reference/android/media/MediaRecorder.html – Simon
確定它不再崩潰,當我刪除該代碼,但現在錄音被拉伸。 – TastyLemons