Android
Android ビデオ録画機能を作る
Androidでビデオ録画機能を作る時に気をつけたいこと
Android ビデオを録画するサンプルコードでビデオ録画をするアプリのサンプルコードを紹介しましたが、実際のアプリはこんな単純に作る人はいないと思います。
で、機種依存とか、わけのわからないエラーだとか、クラッシュしまくりに苦しめられる前に!
よかったら、下記を読んでみてください。
実は、Android ビデオを録画するサンプルコードでは、かなり簡単に動作するものを作れたので、そのままアプリを作ってしまいました。
麻雀で言えば、手なりに手を進めてしまって、あまりよくない状態です。
後々、いろいろなエラーに苦しめられました。
しかし、次は同じ過ちは犯さないぞ!これを最初から知っていればこんなに苦しまなかったのに!という反省もこめてまとめておきました。
公式ドキュメントをちゃんと読む!
本当に当たり前のことですが、ついつい英語だからと、他のサイトにも紹介されているからと飛ばしてしまいましたね。
Camera
http://developer.android.com/guide/topics/media/camera.html
特にBuilding a Camera Appのあたりから、注意して読みましょう。
ビデオを録画するには、MediaRecorderというクラスを使いますが、Cameraと切って切り離せないからです。
まずは、Cameraをちゃんと扱わないと、アプリがじゃんじゃん落ちることになります。
カメラの注意点
以下、公式サイトの注意点をピックアップして記述します。
Cameraについて、この順番で利用します。
- カメラを見つけてアクセスする
- プレビューを作る
- プレビューレイアウトを作る
- リスナーを作り、ビデオ録画の準備をする
- ビデオを録画し、ファイルを保存する
- カメラをリリースする
カメラアプリが落ちたり不具合になる原因のひとつが、カメラをリリースできていないことが多いです。
リリースしないと、自分のアプリ内でも再度カメラにアクセスできず、落ちてしまうのです!!(おそろしや)
Camera.release()を忘れないようにしましょう。
Camera.openをするときは、下記のようにGoogleさんがサンプルを示してくれているように、一度中身を空してからopen()しましょう。
そして、try~catchで囲む。
/** A safe way to get an instance of the Camera object. */ public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); // attempt to get a Camera instance } catch (Exception e){ // Camera is not available (in use or does not exist) } return c; // returns null if camera is unavailable }
ビデオの注意点
上記でカメラを作ってみたら、次はビデオです。
ビデオを動かすためには順番がかなり大事。
- カメラをopen()する – Use the Camera.open() to get an instance of the camera object.
- プレビューに接続する
- プレビューをスタートする
- ビデオ録画をスタートする だがその前に下記をすべし
- ビデオをストップする
- プレビューをストップする
- カメラをリリースする
カメラをUnlockする (Camera.unlock()を使う) MediaRecorderを設定する 次の順番でね! setCamera() setAudioSource() setVideoSource() ビデオのアウトプット形式とエンコードを設定 setOutputFormat() setAudioEncoder() setVideoEncoder() setOutputFile() setPreviewDisplay() - ※くどいようですが、必ず上記の順番で!さもなくば、お主に恐ろしい呪いがふりかかるであろう…的な感じです。
これも、下記の順番を守るように!!!
Stop MediaRecorder - Stop recording video by calling MediaRecorder.stop(). Reset MediaRecorder - Optionally, remove the configuration settings from the recorder by calling MediaRecorder.reset(). Release MediaRecorder - Release the MediaRecorder by calling MediaRecorder.release(). Lock the Camera
onPauseのときなどに、MediaRecorderをリリースしたり、Cameraをリリースするのを忘れない!
reset()したり、release()したり、nullにするのを忘れないようにします。
これもGoogleさんがサンプルコードを書いてくれているので、これを使うのが安全でしょう。
@Override protected void onPause() { super.onPause(); releaseMediaRecorder(); // if you are using MediaRecorder, release it first releaseCamera(); // release the camera immediately on pause event } private void releaseMediaRecorder(){ if (mMediaRecorder != null) { mMediaRecorder.reset(); // clear recorder configuration mMediaRecorder.release(); // release the recorder object mMediaRecorder = null; mCamera.lock(); // lock camera for later use } } private void releaseCamera(){ if (mCamera != null){ mCamera.release(); // release the camera for other applications mCamera = null; } }