Androidでビデオ録画機能を作る時に気をつけたいこと

Android
Android ビデオ録画機能を作る

Androidでビデオ録画機能を作る時に気をつけたいこと

Android ビデオを録画するサンプルコードでビデオ録画をするアプリのサンプルコードを紹介しましたが、実際のアプリはこんな単純に作る人はいないと思います。

で、機種依存とか、わけのわからないエラーだとか、クラッシュしまくりに苦しめられる前に!
よかったら、下記を読んでみてください。

実は、Android ビデオを録画するサンプルコードでは、かなり簡単に動作するものを作れたので、そのままアプリを作ってしまいました。

麻雀で言えば、手なりに手を進めてしまって、あまりよくない状態です。
後々、いろいろなエラーに苦しめられました。

しかし、次は同じ過ちは犯さないぞ!これを最初から知っていればこんなに苦しまなかったのに!という反省もこめてまとめておきました。

公式ドキュメントをちゃんと読む!

本当に当たり前のことですが、ついつい英語だからと、他のサイトにも紹介されているからと飛ばしてしまいましたね。

Camera
http://developer.android.com/guide/topics/media/camera.html

特にBuilding a Camera Appのあたりから、注意して読みましょう。
ビデオを録画するには、MediaRecorderというクラスを使いますが、Cameraと切って切り離せないからです。
まずは、Cameraをちゃんと扱わないと、アプリがじゃんじゃん落ちることになります。

カメラの注意点

以下、公式サイトの注意点をピックアップして記述します。

Cameraについて、この順番で利用します。

  1. カメラを見つけてアクセスする
  2. プレビューを作る
  3. プレビューレイアウトを作る
  4. リスナーを作り、ビデオ録画の準備をする
  5. ビデオを録画し、ファイルを保存する
  6. カメラをリリースする

カメラアプリが落ちたり不具合になる原因のひとつが、カメラをリリースできていないことが多いです。
リリースしないと、自分のアプリ内でも再度カメラにアクセスできず、落ちてしまうのです!!(おそろしや)
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
 }

ビデオの注意点

上記でカメラを作ってみたら、次はビデオです。
ビデオを動かすためには順番がかなり大事。

  1. カメラをopen()する – Use the Camera.open() to get an instance of the camera object.
  2. プレビューに接続する
  3. プレビューをスタートする
  4. ビデオ録画をスタートする だがその前に下記をすべし 
  5.     カメラをUnlockする (Camera.unlock()を使う)
        MediaRecorderを設定する 次の順番でね!
            setCamera()
            setAudioSource()
            setVideoSource()
            ビデオのアウトプット形式とエンコードを設定
                setOutputFormat()
                setAudioEncoder()
                setVideoEncoder() 
            setOutputFile() 
            setPreviewDisplay() -
        ※くどいようですが、必ず上記の順番で!さもなくば、お主に恐ろしい呪いがふりかかるであろう…的な感じです。
    
    1. ビデオをストップする

    これも、下記の順番を守るように!!!

        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 
    
    1. プレビューをストップする
    2. カメラをリリースする

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です