Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(10)

# マルチメディア

## オーディオ

### オーディオ形式

Android標準で対応しているオーディオ形式

|形式|録音|再生|ファイルタイプ|
|---|---|---|---|
|AAC LC\LTP|〇|〇|3GPP(.3gp),MPEG-4(.mp4, .m4a),ADTS raw AAC(.aac, Android3.1以降で再生可, Android4.0以降で録音可,ADIFはサポート外, MPEG-TS(.ts, シーク不可, Android3.0以降)|
|HE-AACv1(AAC+)||〇|3GPP(.3gp),MPEG-4(.mp4, .m4a),ADTS raw AAC(.aac, Android3.1以降で再生可, Android4.0以降で録音可,ADIFはサポート外, MPEG-TS(.ts, シーク不可, Android3.0以降)|
|HE-AACv2(enhanced AAC+)||〇|3GPP(.3gp),MPEG-4(.mp4, .m4a),ADTS raw AAC(.aac, Android3.1以降で再生可, Android4.0以降で録音可,ADIFはサポート外, MPEG-TS(.ts, シーク不可, Android3.0以降)|
|AMR-NB|〇|〇|3GPP(.3gp)|
|AMR-WB|〇|〇|3GPP(.3gp)|
|FLAC||〇|FLAC(.flac) Android3.1以降|
|MP3||〇|MP3(.mp3)|
|MIDI||〇|Type 0と1(.mid, .xmf, .mxmf), RTTTL\RTX(.rtttl, .rtx), OTA(.ota), iMelody(.imy)|
|Vorbis||〇|Ogg(.ogg), Matroska(.mkv, Android4.0以降)|
|PCM/WAVE||〇|WAVE(.wav)|

利用できるオーディオ形式はAndroidのバージョンによって変わるため、Supported Media Formatを参照する必要あり

http://developer.android.com/intl/ja/guide/appendix/media-formats.html

### MediaPlayerクラス

android.mediaパッケージの、MediaPlayerクラスを使用する。ライフサイクルがある。
コンストラクタを使用する方法と、createメソッドを使う方法がある。

#### MediaPlayerのライフサイクル

インスタンス生成でIdle状態になる。各メソッドを呼び出すことで状態が変化する。
状態を無視したメソッドを呼び出すとError状態になる。
releaseはどの状態からでも呼び出せる。releaseメソッドでMediaplayerはEnd状態に移行し、終了する。
Initialize状態でprepareAsyncメソッドを呼び出すとPreparingに遷移し、その後自動的にOnPreparedListenerインタフェースのonPreparedメソッドが呼ばれてPrepared状態に遷移する。
Started状態で再生完了した場合、繰り返しモードではない場合は、自動的にPlaybackCompleted状態に遷移する。

MediaPlayerの状態

|状態|説明|
|---|---|
|Idle|インスタンス生成後やリセット後のアイドル状態|
|Initialized|再生するデータを設定し終えた状態|
|Preparing|準備中の状態で自動的にPreparedに移行する|
|Prepared|準備完了の状態|
|Started|再生中の状態|
|Paused|一時停止中の状態|
|PlaybackComplete|オーディオの再生が完了した状態|
|Stopped|停止中の状態|
|End|ライフサイクルを終えた状態|
|Error|エラーが発生した状態|

#### オーディオを再生する（コンストラクタ）

コンストラクタを使用し、MediaPlayerのインスタンスを生成する(Idle状態)
EnvironmentクラスのgetExternalStorageDirectoryメソッドを使用し外部ストレージのパスを取得して、
オーディオファイルへのパスを取得している。
setDataSourceメソッドの引数に、オーディオファイルのパスを設定して呼び出すとInitialize状態に遷移するので、
続けてprepareメソッドを呼び出しPrepared状態に移行させる。
最後にstartメソッドを呼び出すことで、Started状態に移行して、オーディオファイルが再生される。

#### オーディオを再生する（createメソッド）

MediaPlayerクラスのcreateメソッドを使用することで、Prepared状態のインスタンスを生成できる。
その場合はリソースIDが必要になる
createメソッドの第一引数はContextを指定する。第二引数にオーディオファイルのリソースIDを指定する。
オーディオファイルは/res/rawファイルに格納する必要がある。

リソースIDの代わりにUriクラスを利用して再生することも可能

#### MediaPlayerのメソッド

一時停止するにはpauseメソッドを呼び出す。呼び出したことでMediaPlayerはPaused状態に移行する。
Paused状態では、startメソッドか、stopメソッドを呼び出すことが出来る。

停止するにはstopメソッドを呼び出す。呼び出したことでMediaPlayerはStopped状態に移行する。
再度prepareメソッドを呼び出すことで、startメソッドが呼び出せるようになる。

Idle状態に戻すには、resetメソッドを使う。PreparingとEnd以外の時に使える。

MediaPlayerの使用をやめるにはreleaseメソッドを呼び出す。呼び出したことでEnd状態に移行する。

### SoundPoolクラス

android.mediaパッケージのSoundPoolクラスも使用できる。
このクラスは効果音などの短いオーディオを再生するのに向いている。

#### オーディオを再生する

SoundPoolクラスのインスタンスを生成する。第一引数には同時に再生するオーディオ数を設定。第二引数にはストリームの種類を指定する（通常はSTREAM_MUSIC）。第三引数は0固定（現時点では）
次にloadメソッドを呼び出して、オーディオデータを読み込む。loadメソッドには、ContextやリソースID,ファイルパスなどを指定する。戻り値としてint型の値が返るので次に使う。
次にplayメソッドにint型の値を使って再生する（第一引数）。第二引数、第三引数には左右の音量を0.0-1.0の範囲で設定する。第四引数には優先度（0が一番低い）を設定し、第五引数にはループの有無（0:ループ無し、-1:無限ループ）を設定する。第6引数には再生速度を指定する(0.5~2.0の範囲)
使い終わったらreleaseメソッドを呼び出し終了する。

loadメソッドの直後にplayをしても、再生できない場合がある（ロードが済んでいない場合）Android2.2(APIレベル8以降)であれば、soundPoolクラスのsetOnLoadCompleteListenerメソッドを呼び出し、OnLoadCompleteListenerインタフェースを実装したクラスのインスタンスを登録することで、onLoadCompleteメソッドで行える。

### MediaRecorderクラス

android.mediaパッケージのMediaRecorderクラスを使用する。MediaRecorderにもライフサイクルがある。
インスタンス作成にはコンストラクタを使用する方法がある。

#### MediaRecorderのライフサイクル

|状態|説明|
|---|---|
|Initial|インスタンス生成後や、リセット後の初期状態|
|Initialized|オーディオソースやビデオソースを設定し終えた状態|
|DataSourceConfigured|出力形式を設定し終えた状態|
|Prepared|準備完了の状態|
|Recording|記録中の状態|
|Released|ライフサイクルを終えた状態|
|Error|エラーが発生した状態|

#### オーディオを録音する

MediaRecorderのコンストラクタを使用し、Initial状態のインスタンスを生成する。
setAudioSourceメソッドの引数にAudioSourceクラスの定数を設定し、オーディオソースを指定する（MIC:マイクなど）指定したことでInitializedに移行する。
setOutputFormatメソッドの引数に、OutputFormatクラスの定数を設定し出力形式を指定する(THREE_GPPを指定)指定したことでDataSourceConfigured状態に移行する。

出力形式の定義

|定数|説明|
|---|---|
|AMR_NB|AMR NB形式|
|AMR_WB|AMR WB形式|
|DEFAULT|デフォルト|
|MPEG_4|MPEG4メディア形式|
|RAW_AMR|AMR NB形式|
|THREE_GPP|3GPPメディア形式|

DataSourceConfigured状態では、setAudioEncoderメソッドとsetOutputFileメソッドを呼び出し、圧縮方法とファイル名を指定する。

音声の圧縮方法

|定数|説明|
|---|---|
|ACC|ACCオーディオコーディック|
|AMR_NB|AMR(Narrowband)オーディオコーディック|
|AMR_WB|AMD(Wideband)オーディオコーディック|
|DEFAULT|デフォルト|

設定が終わったら、prepareメソッドを呼び出しPrepared状態に移行する。
最後にstartメソッドを呼び出すとRecording状態に遷移して、録音を開始する。

#### MediaRecorderのメソッド

録音を終了するにはstopメソッドを呼び出す。
使用をやめるにはreleaseメソッドを呼び出す。Initial状態の時だけ呼び出せる。

#### 許可情報の設定

録音するにはandroid.permission.RECORD_AUDIOを許可する必要がある、
SDカードに保存する場合はandroid.permission.WRITE_EXTERNAL_STORAGE

## ビデオ

### 利用可能なビデオ形式

最新はデベロッパーサイトを参照
http://developer.android.com/intl/ja/guide/appendix/media-formats.html

|ビデオ形式|再生|ファイルタイプ|
|---|---|---|
|H.263|〇|3GPP(.3gp),MPEG-4(.mp4)|
|H.264 AVC|〇|3GPP(.3gp),MPEG-4(.mp4), MPEG-TS(.ts, ACCオーディオのみ、シーク不可, Android3.0以降|
|MPEG-4 SP|〇|3GPP(.3gp)|
|VP8|〇|WebM(.webm), Matroska(.mkv, Android 4.0以降)|

#### VideoViewクラス

android.widgetパッケージのVideoViewクラスを利用する。
インスタンスを生成する方法と、レイアウトで定義する方法がある。

#### MediaControllerクラス

再生や、停止はVideoViewクラスのstartメソッドやstopPlaybackメソッドで行える。
MediaControllerクラスを利用すると操作用ボタンのビューが利用できる

#### ビデをを再生する

/res/layoutにレイアウトを作成してビデオを再生する
findViewByIdメソッドでレイアウトからVideoViewのインスタンスを取得する。
次にsetMediaControllerメソッドで、VideoViewにMediaControllerをセットする。
setVideoPathメソッドを呼び出して、ファイルへのパスを設定する。
setVideoUriを利用することでURI指定して再生できる（ネットワーク上のファイルを再生できる）