ユーザーID パスワード

技術情報

  • FAQ よくある質問
  • 個人ユーザー向けサービスのお手続きについて

コード&コラム

第6回
カメラを使ってみよう(後編)


前へ 1 |2 |3 |4 次へ

Step2 ビデオカメラアプリを作成しよう

続いてカメラを使ったアプリ制作としてビデオカメラ機能を持ったアプリを作成していきたいと思います。基本的に利用する部品は同じものですのでカメラアプリに少し手を加える程度の作業で作成できます。主な流れとしては、「アプリ起動→フルスクリーンでのプレビュー・録画開始→Backボタンでアプリ終了と同時にプレビュー・録画終了、保存作業を行う」といった機能を計画しています。

まずは「VidRecApp」という名前の新しいプロジェクトの作成を行います。

プロジェクト名 VidRecApp
ビルド・ターゲット Android 2.2
アプリケーション名 VidRecApp
パッケージ名 com.example.vidrecapp
アクティビティーの作成 VidRecApp
最小SDKバージョン 8

VidRecApp.javaが生成されました。今回もSurfaceViewを継承したVidRecView.javaを追加します。[ファイル]→[新規]→[クラス]をクリックして「新規Javaクラス」ダイアログを編集します。名前を「VidRecView」に設定して[完了]を押しましょう。継承を含めたコードの編集は後ほど行います。

img

まずはVidRecApp.javaを編集していきます。これまでと同じようにフルスクリーンの記述を加え、VidRecView.javaを画面に表示するようにしましょう。下記の様になります。

public class VidRecApp extendsActivity {
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(new VidRecView(this));
    }
}

次に先ほど作成したVidRecView.javaに手を加えていきます。基本的には前回のCameraView.javaとそう変わりません。まずはクラスにSurfaceViewを継承し、サーフェスホルダーコールバックを実装します。サーフェスホルダーのオブジェクトを「surfaceholder」という名前で生成し、コンストラクタを作成します。コンストラクタ内にはサーフェスホルダーの生成とプッシュバッファーの指定を記述します。コールバックを実装した時点で「surfaceCreated()」「surfaceChanged()」「surfaceDestroyed()」のメソッドが必要になるので作成します。

public class VidRecView extends SurfaceView implements
SurfaceHolder.Callback
{
    private SurfaceHolder surfaceolder;

    public VidRecView(Context context){
        super(context);
        surfaceholder=getHolder();
        surfaceholder.addCallback(this);
        surfaceholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder surfaceholder;){
    }
    public void surfaceChanged(SurfaceHolder surfaceholder, int format, int width, int height){
    }
    public void surfaceDestroyed(SurfaceHolder surfaceholder){
    }

今回主に重要なのは「surfaceCreated()」のメソッドの内容です。カメラアプリではカメラの起動とプレビューの表示先の指定を行っていましたが、今回はプレビューと録画・保存を同時に行うため「onTouchEvent()」や「onPictureTaken()」メソッドは利用しません。
映像を撮影するためのメソッドは様々なものが用意されています。メソッドには以下のようなものがあります。

setVideoSource 録画の入力ソースを指定(DEFAULT, CAMERA)
setOutputFormat 出力フォーマットを指定(DEFAULT, 3GPP, MPEG4, raw AMR)
setVideoEncoder ビデオエンコーダを指定(DEFAULT, H263, H264, MPEG_4_SP)
setOutputFile 出力ファイル名を指定
setVideoSize 動画のサイズ(width, height)を正の整数で指定
setVideoFrameRate 動画のフレームレートを正の整数で指定
setPreviewDisplay 録画中のプレビューに使用するSurfaceを指定
prepare 録画準備
start 録画開始
stop 録画停止
reset アイドル状態に戻る。オブジェクトは解放しない。
release オブジェクトの解放

img

上記のメソッドを以下の順番で呼び出すことにより映像の録画を制御します。
撮影する映像の入出力・エンコーダ、保存先のディレクトリとプレビュー先を設定してから撮影を開始します。
加えて今回は動画をSDカードに保存するためSDカードの保存先を取得し、ランダムな数字をつけてmp4フォーマットにて保存するようにします。

    public voidsurfaceCreated(SurfaceHolder surfaceholder){
        try{
            //入力ソースをカメラに指定
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            //出力フォーマットを端末のデフォルトに設定
            recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

            //エンコーダを端末のデフォルトに設定
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

            //SDカードのディレクトリを取得
            File dir=Environment.getExternalStorageDirectory();

            //一時ファイルをSDカードのディレクトリに保存
            File file=File.createTempFile("video",".mp4",dir);

            //出力ファイル名を設定
            //ランダムな数字を付加しています
            recorder.setOutputFile(file.getAbsolutePath());

            //プレビューに使用するサーフェスを指定
            recorder.setPreviewDisplay(surfaceholder.getSurface());
            recorder.prepare();//録画準備
            recorder.start();//録画開始
        }catch (Exception e){
        }
    }

「surfaceChanged()」には何も設定しなくて大丈夫です。「surfaceDestroyed()」にて録画の停止とオブジェクトの開放を行います。

    public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h){
    }
    public void surfaceDestroyed(SurfaceHolder surfaceholder){
        recorder.stop();//録画の停止
        recorder.release();//オブジェクトの開放
    }

以上でコードの編集は終了です!
最後にAndroidManifest.xmlの編集を行います。横画面で利用するため、VidRecAppアクティビティの「ScreenOrientation」を「landscape」に設定します。
さらにカメラと外部ストレージ(SDカード)を利用する旨を追加します。
追加後のAndroiManifest.xmlは以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.vidrecapp"
    android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".VidRecApp" android:label="@string/app_name"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

第6回 カメラを使ってみよう(後編)
 Step1 オートフォーカス機能を利用しよう
 Step2 ビデオカメラアプリを作成しよう
 Step3 録画して保存しよう

サンプルコード

第1回 リファレンスコード(文字列編)

第2回 リファレンスコード2(グラフィックス編)

第3回 リファレンスコード3(タッチイベント編)

第4回 リファレンスコード4(チェックボックス/ラジオグループ編)

第5回 リファレンスコード5(スピナー編)

第6回 リファレンスコード6(サウンド/ムービー編)

第7回 リファレンスコード7(トースト編)

第8回 リファレンスコード8(Google Maps API利用編)

第9回 リファレンスコード9(SQLite編)

第10回 リファレンスコード10(音声認識編)

第11回 リファレンスコード11(日付/時刻ダイアログ編)

第12回 リファレンスコード12(Bluetooth編)