Develop with pleasure!

福岡でCloudとかBlockchainとか。

AndroidでAudioとVideo

Media and Camera | Android Developersをテキトーに訳してみる。

Audio and Video

Androidプラットフォームは、オーディオやビデオ、画像を簡単にアプリケーションに組み込めるよう、一般的なメディアタイプのエンコーディング/デコーディングの仕組みを提供しています。プラットフォームのメディア機能にアクセスするのは、すごく簡単です。通常のAndroidのintentやactivityの仕組みと同じように利用することができます。

Androidはいろんな種類のデータソースからオーディオやビデオを再生できます。アプリケーションのリソースに保存されているファイルから再生することもできるし、ファイルシステムに保存されているファイルからでも、ネットワークを介したストリーミング再生をすることもできます。オーディオやビデオをアプリケーション内で再生するには、MediaPlayerクラスを使います。

またプラットフォームは、携帯のデバイスを利用してオーディオやビデオを記録することもできます。オーディオやビデオを記録するためには、MediaRecorderクラスを使います。エミュレータはこれらを記録するためのハードウェアを持っていませんが、実機であればこれらの機能が提供されています。

Androidがサポートするメディアタイプのリストについては、Android Media Formatsを参照して下さい。


Audio and Video Playback

メディアは、どこからでも(アプリケーションリソースや、ファイルシステム、ネットワーク経由)再生可能です。

オーディオデータを再生可能なのは標準の出力デバイス(携帯のスピーカーかBluetoothのヘッドセット)のみです。会話のオーディオファイルを再生することはできません。(んー、conversation audioって何だろ?)


Playing from a Raw Resource(アプリのリソースファイルから再生する場合)

おそらく一般的に一番やりたいことは、あのたのアプリケーションでメディア(特に音)を再生することでしょう。これは簡単で、

  1. まず、音源(もしくはその他メディアファイル)をプロジェクトのres/rawフォルダに配置します。配置するとEclipse Pluginがファイルを見つけ、Rクラスからで参照可能なようにリソースを作成します。
  2. 次にMediaPlayer.createを使って、MediaPlayerのインスタンスを生成し、そのインスタンスstart()メソッドを実行します。
 MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
 mp.start();

停止する際は、stop()を呼びます。もし後でメディアをリプレイしたい場合は、reset()メソッドとprepare()メソッドをMediaPlayerオブジェクトのstart()メソッドを再度呼ぶ前に実行します。(インスタンス生成時のcreateメソッドが実行された際に、prepare()メソッドが呼ばれています)

一時停止する場合は、pause()を呼びます。再開する場合は再度start()を呼びます。


Playing from a File or Stream(ファイルシステムもしくはストリーミング再生する場合)

再生するメディアファイルはファイルシステムもしくはWebのURLで指定可能です。

  1. MediaPlayerのインスタンスをnewで生成します。
  2. 続いて再生したいメディアが置かれているファイルシステムもしくはURLのパスを引数にしてsetDataSource()を呼びます。
  3. 最初にprepare()メソッドを実行し、その後start()メソッドを呼びます。
 MediaPlayer mp = new MediaPlayer();
 mp.setDataSource(PATH_TO_FILE);
 mp.prepare();
 mp.start();

stop()とpause()メソッドはアプリのリソースファイルから再生する場合と同様に動作します。

注意:mpはnullになる可能性があるので、良いコードとしてはnewした後にnullチェックをすべきです。また、存在していないファイルのパスが指定されている可能性があるため、setDataSource()を呼ぶ際に、IllegalArgumentException 及びIOException をキャッチもしくはthrowする必要があります。

注意:もしオンラインのメディアファイルのパスを指定した場合は、そのファイルがプログレッシブダウンロード可能である必要があります。


Playing JET content

Androidプラットフォームは、アプリケーション内でJETオーディオコンテンツのインタラクティブな再生を追加することができる、JETエンジンが組み込まれてます。SDKに付属しているJetCreator オーサリングアプリケーションを利用してインタラクティブな再生のためのJETコンテンツを作成することができます。アプリケーション内でJET コンテンツを再生・管理するには、JetPlayerクラスを使用します。

JETのコンセプトとJetCreator オーサリングツールの使い方については、JetCreator User Manualを参照して下さい。このツールはOS X、Windows、Linuxでコンテンツの作成機能をサポートします。

以下がSDカードに保存されている.jetコンテンツを再生するサンプルです。

JetPlayer myJet = JetPlayer.getJetPlayer();
myJet.loadJetFile("/sdcard/level1.jet");
byte segmentId = 0;

// queue segment 5, repeat once, use General MIDI, transpose by -1 octave
myJet.queueJetSegment(5, -1, 1, -1, 0, segmentId++);
// queue segment 2
myJet.queueJetSegment(2, -1, 0, 0, 0, segmentId++);

myJet.play();

SDKには、ゲーム内でJetPlayerを使ってインタラクティブなサウンドトラックを作成する、JetBoyというサンプルアプリケーションが含まれています。また、音楽やゲームロジックを同期するために、どのようにJETイベントを使用するか記載されています。JetBoyは/platforms/android-1.5/samples/JetBoyに置いてあります。


Audio Capture

デバイスからのオーディオのキャプチャは、オーディオ/ビデオの再生より少し複雑です。

  1. newでMediaRecorderインスタンスを生成します。
  2. ContentValuesインスタンスを生成し、 TITLEやTIMESTAMPといった標準的なプロパティ及び重要なMIME_TYPEをセットします。
  3. データの保存先のファイルパスを作成します。(Content database へのエントリーの作成及びその際に自動的に割り当てられたパスを取得するのにandroid.content.ContentResolverが使えます。)
  4. setAudioSource()を使用してオーディオソースをセットします。おそらくMediaRecorder.AudioSource.MICをセットするでしょう。
  5. setOutputFormat()を使用して出力するファイルのフォーマットをセットします。
  6. setAudioEncoder()を使用してオーディオのエンコーダーをセットします。
  7. 生成したMediaRecorder インスタンスのprepare()メソッドを呼びます。
  8. オーディオのキャプチャを開始する際は、start()メソッドを呼びます。
  9. キャプチャを停止する場合は、stop()メソッドを呼びます。
  10. キャプチャが完了したら、MediaRecorder インスタンスrelease()メソッドを呼びます。


Example: Audio Capture Setup and Start

以下の例では、セットアップの方法、オーディオキャプチャの開始までを示しています。

    recorder = new MediaRecorder();
    ContentValues values = new ContentValues(3);

    values.put(MediaStore.MediaColumns.TITLE, SOME_NAME_HERE);
    values.put(MediaStore.MediaColumns.TIMESTAMP, System.currentTimeMillis());
    values.put(MediaStore.MediaColumns.MIME_TYPE, recorder.getMimeContentType());
    
    ContentResolver contentResolver = new ContentResolver();
    
    Uri base = MediaStore.Audio.INTERNAL_CONTENT_URI;
    Uri newUri = contentResolver.insert(base, values);
    
    if (newUri == null) {
        // need to handle exception here - we were not able to create a new
        // content entry
    }
    
    String path = contentResolver.getDataFilePath(newUri);

    // could use setPreviewDisplay() to display a preview to suitable View here
    
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(path);
    
    recorder.prepare();
    recorder.start();

Stop Recording

引き続き、キャプチャの停止処理です。

    recorder.stop();
    recorder.release();