第5回:Android アプリにおけるメディア再生・記録について

最終更新日:2024年4月30日

ホームへ戻る

本日の課題一覧(チェックのみ提出不要)

  1. 演習問題5_1(必須)
  2. 演習問題5_2(必須)
  3. 演習問題5_3(任意)

イントロダクション

Android プラットフォームは、オーディオやビデオ、画像を簡単にアプリケーションに組み込めるよう、一般的なメディアタイプのエンコーディング/デコーディングの仕組みを提供している。Android はいろんな種類のデータソースからオーディオやビデオを再生できる。本実験では MP3 フォーマットのメディアを操作するがその他に Android がサポートするメディアタイプの詳細なリストについては、Android Media Formats を参照して下さい。

Android のメディア操作は、「android.media」パッケージで実現する。このパッケージには、オーディオやビデオをアプリケーション内で再生には MediaPlayer クラス、記録するためには MediaRecorder クラスが用意されている。それぞれのクラスが提供している主なメソッドを下記表1にまとめている。

表1. メディア再生・記録関連メソッド一覧
クラス名 メソッド名 概要
MediaPlayer
create() MediaPlayer のインスタンス生成
start() MediaPlayer のインスタンス再生
stop() インスタンスの再生停止
pause() インスタンスの再生一時停止
MediaRecorder
prepare() MediaRecorder のインスタンス生成
start() オーディオのキャプチャを開始
stop() キャプチャを一時停止
release() キャプチャを完了

音楽ファイルを再生する

Android では、アプリケーションのリソースに保存されているファイルから再生することもできるし、ファイルシステムに保存されているファイルからでも、ネットワークを介したストリーミング再生をすることもできる。本実験では、まずリソースに保存されているファイルからメディアを再生する方法を実施する。

アプリのリソースファイルから再生する場合

サウンドファイルのプロジェクトへの追加

再生するサウンドファイルをプロジェクトへ追加するため、下記の操作を行なう。尚、サウンドファイルは canvas 内 [ファイル > data] に格納されている。

  1. 左側のプロジェクトファイル内の "res" フォルダを選択して右クリックする。Pop-up メニューが表示されるので [New] メニューの [Directory] サブメニューを選択する。(図1を参照)
  2. [New Directory] ダイアログが表示され、"res" ノードを選択する。ダイアログ下部の「Enter new directory name:」欄に作成するフォルダ名を入力する。フォルダ名は "raw" とする(他の名前は不可)。フォルダが作成できると [Project Explorer] の "res" フォルダ内に "raw" フォルダが追加される(表示されなければ "res" フォルダを synchronize して下さい)。(図2を参照)
  3. MP3 ファイルを準備し、「Project Explorer」の "raw" フォルダにドラッグ&ドロップする。(図3を参照)
    【注意】 File-based resource names must contain only lowercase a-z, 0-9, or underscore!
  4. ファイルをドロップすると「Move」ダイアログが表示され、コピー先のフォルダ名を確認し、「Refactor」を押す。(図4を参照)
fig1.png
図1. Sound ファイルをプロジェクトに追加する方法(その1)
fig2.png
図2. Sound ファイルをプロジェクトに追加する方法(その2)
fig3.png
図3. Sound ファイルをプロジェクトに追加する方法(その3)
fig4.png
図4. Sound ファイルをプロジェクトに追加する方法(その4)
再生に必要なコード

MediaPlayer のクラスメソッド create() にて MediaPlayer のインスタンスを生成し、そのインスタンスの start() メソッドでメディアを再生する(下記サンプルコード)。


    MediaPlayer mp;

    mp = MediaPlayer.create(this, R.raw.media_resouce_name); // media_resouce_name には res フォルダに追加したメディアファイルの名前(拡張子なし)
    mp.start();
                        

ファイルシステムもしくはストリーミング再生する場合

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

停止する、もう一度再生する場合

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

一時停止する、もう一度再生する場合

一時停止する場合は、インスタンスの pause() メソッドを呼ぶ。一時停止したところから再開する場合は再度直接インスタンスの start() メソッドを呼ぶ。


    MediaPlayer mp_stream = new MediaPlayer();
    mp_stream.setDataSource(this, Uri.parse("http://sc21vlweb01.cc.ag.aoyama.ac.jp/user/t23428/sleep_away.mp3"));
    mp_stream.prepare();
    mp_stream.start();
                    

上記に加えて、アプリのネットワーク設定を用意する必要がある。
まず AndroidManifest.xml の application タグに以下を追記する。


    <application
        …
        android:networkSecurityConfig="@xml/network_security_config"
        …>
                    

そして、res フォルダに xml フォルダーを作成し、その中以下の中身の "network_security_config.xml" という名の新規リソースファイルを作成する。


    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
                    

演習課題5_1: メディアの再生(必須)

上記説明を参考に、以下の内容を実施せよ

  1. ファイルシステムから(resource から)メディア取得のインスタンス生成・再生のコードを適切な場所に追加し、音楽が流れていることを確認する。また、Thread.sleep(…) を用いて3秒後自動的に停止するようにする。
  2. 次のWeb URL からメディア取得のインスタンス生成・メディア再生のコードを追加し、音楽が流れていることをお確認する。また、Thread.sleep(…) を用いて3秒後自動的に停止するようにする。
    • http://sc21vlweb01.cc.ag.aoyama.ac.jp/user/t23428/sleep_away.mp3
    • 必要があれば例外処理(Exception)に必要なコードも追加
    • さらに、Web にアクセスするために必要な許可(permission)を AndroidManifest.xml に追加する(PERMISSION名は自分で探す)
    • 【注意】学内のネットワークに繋がらないとファイルにアクセスできません!(agwlan, it_325, vpn等)

演習課題5_2: GUI でメディア再生を制御する(必須)

上記説明を参考に、以下の内容を実施せよ

  1. [Play] ボタンをタップするとサウンドの再生が始まる、[Stop] ボタンをタップすると再生が停止するという操作ができるようにプログラムを変更する。
  2. GUI に一時停止(pause)ボタンを追加し、押した際再生中のメディアファイルが一時停止するようにボタンクリック時処理を追加する。その動作を確認する。(結果見た目は図5を参照)
  3. メディアの永さや、一時停止した際の経過時間はインスタンスの get???() メソッド(どのメソッドか見つけること)で取得し、ミリ秒で取得した値を"分:秒"の文字列に変換・表示する。

fig5.png
図5. 一時停止ボタンを配置し、押した際のアプリスクリーンショット

演習課題5_3: マイクで音を記録・保存する(任意)

下記「音を記録しファイルに保存する」の説明を参考に録音に必要な手順を参考ウェブサイトなどから完成させ、下記のように実装する。

  1. GUI に記録ボタン(record)を追加し、押した際に記録が開始するようにする。
  2. stop ボタンを押した際、再生中ならば再生を停止、記録中ならば記録を停止・完了するような条件を追加する。

音を記録しファイルに保存する

デバイスからのオーディオのキャプチャは、オーディオ/ビデオの再生より少し複雑なる。下記、主な手順をまとめた。

  1. new で MediaRecorder のインスタンスを生成します。
  2. AndroidManifest.xml に Audio 記録用の Permission(RECORD_AUDIO)と外部記録の書き込み用 Permission(WRITE_EXTERNAL_STORAGE)を追加する。
  3. MediaRecorder インスタンスの setAudioSource() メソッドを使用してオーディオソースをセットする。タブレット内蔵のマイクロフォンの場合 MediaRecorder.AudioSource.MIC を入力する。ビデオの場合は CAMCORDER、システムで設定したものならば(例えば Bluetooth マイクなど)DEFAULT
    【注意】端末の設定によって、SetAudioSource() のエラーが発生されます。その際、「設定>アプリ>LGAudioPlayer>許可」にてマイクをONにして下さい。
  4. MediaRecorder インスタンスの setOutputFormat(...) メソッドを使用して出力するファイルのフォーマットをセットする。フォーマットは MediaRecorder.OutputFormat.*** から選定する。
  5. MediaRecorder インスタンスの setAudioEncoder(...) メソッドを使用してオーディオのエンコーダーをセットする。エンコーダは MediaRecorder.AudioEncoder .*** から選定する
  6. 書きこむファイル名とそのパスも設定する(該当するメソッドを自分で探すこと)。 【注意】 場合によって「設定>アプリ>MainActivity>許可」にてストレージを ON にして下さい。
  7. 生成した MediaRecorder インスタンスの repare() メソッドを呼ぶ。

録音できたファイルの書式は「○○.3gp」になります。EmulatorのDevice Exlplorerの「storage/emulated/0/Android/data/jp.aoyama.a123456.xxfirstandroidgui/」内にで確認できるアプリケーションのデータファイル。