MediaRecorderでビデオを録画しています。私のコードは2.3.3では正常に動作しますが、4.0.3では失敗します。
問題は次のとおりです。コードmediaRecorder.stop()がRuntimeExeptionをスローします
Java.lang.RuntimeException: stop failed.
at Android.media.MediaRecorder.stop(Native Method)
logCatメッセージ付き
04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007
更新
MediaPlayerが開始直後に(MediaPlayer.OnErrorListenerを介して)エラーを報告することがわかりました。エラーコードは100(メディアサーバーが停止しました)、追加の-1007です。
MediaRecorderを準備するためのUPDATE 2コード
c = Camera.open();
...
// Step 1: Unlock and set camera to MediaRecorder
camera.unlock();
mediaRecorder.setCamera(camera);
// Step 2: Set sources
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
// manual set up!
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth,
profile.videoFrameHeight);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setAudioEncoder(profile.audioCodec);
//mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoEncoder(profile.videoCodec);
// mediaRecorder.setProfile(profile);
// Step 4: Set output file
mediaRecorder.setOutputFile("somefile.mp4");
// Step 5: Set the preview output
mediaRecorder.setPreviewDisplay(preview.getHolder().getSurface());
// Step 6: Prepare configured MediaRecorder
try {
mediaRecorder.prepare();
} catch ...
{ release mediaRecorder}
次に、単純にmediaRecorder.start()を呼び出します。ビデオをmp4形式にエンコードする必要があることに注意してください。このコードはSamsng Galaxy GIO(Android 2.3.3)で動作し、Acer E305(Android 4.0.2)で説明されているように失敗します
何か案は?ありがとう。
やっと解決しました。問題は、カメラの実際のプレビューを設定する前にプレビューサイズを設定することでした。プレビューサイズ[〜#〜] must [〜#〜]は選択したビデオサイズと等しくなければなりません。
CamcorderProfile profile = [get required profile];
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight);
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay([surface holder]);
mCamera.startPreview();
...
//configure MediaRecorder and call MediaRecorder.start()
4.0.3のMediaRecorder.Javaの「stop」メソッドのドキュメントを引用すると、次のようになります。
記録を停止します。 start()の後にこれを呼び出します。記録が停止したら、作成されたばかりのように、再度構成する必要があります。 stop()が呼び出されたときに有効なオーディオ/ビデオデータが受信されなかった場合、RuntimeExceptionが意図的にアプリケーションにスローされることに注意してください。これは、start()の直後にstop()が呼び出された場合に発生します。この場合、アプリケーションは出力ファイルをクリーンアップする(たとえば、出力ファイルを削除する)ためのアクションを実行できます。これが発生すると、出力ファイルが適切に構築されないためです。
MediaPlayerがこの「メディアサーバーが停止した」と報告しているのは、同じ理由によるものです。コードの残りの部分を投稿して、この問題を引き起こす可能性のある誤解がないかどうかを確認できますか?
Samsung J4 +でも同じ問題が発生しましたAndroid 9 Pie。
ハンドラーでmediaRecorder.start()とmediaRecorder.stop()を実行して修正しました。
private val START = 0;
private val STOP = 1;
inner class CameraHandler(looper: Looper?): Handler(looper) {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
try {
when (msg?.what) {
START -> mediaRecorder?.start()
STOP -> mediaRecorder?.stop()
}
} catch (e: Exception) {
Log.d("debug", e.message)
}
}
}
ハンドラーを宣言します。
private lateinit var mCameraHandler: Handler
onCreateでHandlerThread Looperを使用して初期化します。
val handlerThread: HandlerThread = HandlerThread("Camera Handler Thread")
handlerThread.start()
mCameraHandler = CameraHandler(handlerThread.looper)
録音または停止ボタンがクリックされたとき通話:
mCameraHandler.sendEmptyMessage(START)
mCameraHandler.sendEmptyMessage(STOP)
AndroidエミュレーターAPI 18でこのエラーが報告されているのがわかりました(後のバージョンでは記録が正常に機能していた後))。
私が見つけたのは、MediaRecorder
インスタンスを初期化して開始する前にCamera.startPreview()
を呼び出した場合、_stop failed: -1007
_を呼び出すと_MediaRecorder.stop
_ログが表示されますが、 MediaRecorder
を初期化する前にCamera.stopPreview()
を呼び出した場合、ビデオは正常に録画されます。
これが役に立てば幸い