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;
}
}
