Step2 ビデオカメラアプリを作成しよう
続いてカメラを使ったアプリ制作としてビデオカメラ機能を持ったアプリを作成していきたいと思います。基本的に利用する部品は同じものですのでカメラアプリに少し手を加える程度の作業で作成できます。主な流れとしては、「アプリ起動→フルスクリーンでのプレビュー・録画開始→Backボタンでアプリ終了と同時にプレビュー・録画終了、保存作業を行う」といった機能を計画しています。
まずは「VidRecApp」という名前の新しいプロジェクトの作成を行います。
プロジェクト名 | VidRecApp |
ビルド・ターゲット | Android 2.2 |
アプリケーション名 | VidRecApp |
パッケージ名 | com.example.vidrecapp |
アクティビティーの作成 | VidRecApp |
最小SDKバージョン | 8 |
VidRecApp.javaが生成されました。今回もSurfaceViewを継承したVidRecView.javaを追加します。[ファイル]→[新規]→[クラス]をクリックして「新規Javaクラス」ダイアログを編集します。名前を「VidRecView」に設定して[完了]を押しましょう。継承を含めたコードの編集は後ほど行います。
まずは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 | オブジェクトの解放 |
上記のメソッドを以下の順番で呼び出すことにより映像の録画を制御します。
撮影する映像の入出力・エンコーダ、保存先のディレクトリとプレビュー先を設定してから撮影を開始します。
加えて今回は動画を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 録画して保存しよう