今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

MediaRecorderで録画ができない問題を解決

Androidで、MediaRecoderを使って録画するアプリを作ってたんだけど、録画を開始しようとするとエラーが発生して録画ができなかった。

LogCatを見ると、start failed: -19 ってメッセージが出てるんだけど、原因がわからん。

10-07 13:16:34.053: D/Hogehoge(27073): startRecord() isRecording=false
10-07 13:16:34.083: E/MediaRecorder(27073): start failed: -19
10-07 13:16:34.083: E/MediaRecorder(27073): start failed.
10-07 13:16:34.083: E/MediaRecorder(27073): try to delete broken file: /mnt/sdcard/ext_sd/Android/data/com.satoshis/1410071316.mp4
10-07 13:16:34.083: E/Hogehoge(27073): start failed.

そもそも、MediaRecorder  |  Android Developers に書かれてるコードで実行しようとしても同じエラーが出るし。

MediaRecorder recorder = new MediaRecorder();
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 recorder.setOutputFile(PATH_NAME);
 recorder.prepare();
 recorder.start();   // Recording is now started
 ...
 recorder.stop();
 recorder.reset();   // You can reuse the object by going back to setAudioSource() step
 recorder.release(); // Now the object cannot be reused

しかも、start()に失敗した時に、失敗したという情報を取得する方法がないというのもどうかと思うんだが。。。

いろんなところをぐぐって、最終的に解決に至ったのはやはり Stackoverflow
android - Mediarecorder start failed -19 - Stack Overflow

あれこれ試行錯誤した結果、setCamera()を呼び出せば動作するようになった。

		recorder.setCamera(camera); // この1行!
		recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
		recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
		recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
		recorder.setVideoFrameRate(30);
		recorder.setOutputFile(path);
		recorder.setPreviewDisplay(cameraView.getHolder().getSurface());
		try {
			recorder.prepare();
			recorder.start();
		} catch (Exception e) {
			Log.e(TAG, e.getLocalizedMessage());
		}

試しに、その1行をコメントアウトすると動作しなくなるから、たぶん間違ってない。