■ はじめに
Android で 音声 を 再生 する方法を学ぶ。 なお、音声ファイルは、以下のサイトから落とせる。 ダウンロードしたwavファイルを以下に置く。 ~~~~~ res/raw/***.wav ~~~~~
https://maoudamashii.jokersounds.com/core.cgi
https://soundeffect-lab.info/sound/battle/
■ 音声を再生する方法
* 以下の方法があるらしい。 => 特徴を理解して使い分ける必要がある 【1】SoundPool 【2】MediaPlayer 【3】AudioTrack 【4】JetPlayer
【1】SoundPool
* 短い音声(e.g. 効果音)を再生する際に適したクラス
https://developer.android.com/reference/kotlin/android/media/SoundPool
【2】MediaPlayer
* 音楽ファイルなどを再生する際に適したクラス
https://developer.android.com/reference/kotlin/android/media/MediaPlayer
【3】AudioTrack
* バイトデータを再生するためのクラス
【4】JetPlayer
* JET ファイルを再生するためのクラス
■ サンプル
例1)SoundPool
手順
1)SoundPoolのインスタンスを生成する 2)load()で音声ファイルを読み込み、サウンドIDを取得する 3)play()に2)のサウンドIDを渡して、再生する 4)release()でSoundPoolのリソースを開放する
MainActivity.kt
import android.content.DialogInterface import android.media.AudioAttributes import android.media.SoundPool import android.os.Build import android.os.Bundle import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private lateinit var soundPool:SoundPool private var soundId = 0 @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 1)SoundPoolのインスタンスを生成する val audioAttributes= AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) .build() soundPool = SoundPool.Builder() .setAudioAttributes(audioAttributes) .setMaxStreams(2) .build() // 2)load()で音声ファイルを読み込み、サウンドIDを取得する soundId = soundPool.load( this, R.raw.one, 1) // 複数ロード時 //soundTwo = soundPool.load( // this, // R.raw.two, // 1) button.setOnClickListener { // 3)play()に2)のサウンドIDを渡して、再生する soundPool.play( soundIdOne, 1.0f, 1.0f, 0, 0, 1.0f) } } override fun onPause() { super.onPause() // 4)release()でSoundPoolのリソースを開放する soundPool.release() } }
補足:LOLLIPOP未満の対応
https://www.letitride.jp/entry/2019/05/29/170157
@Suppress("DEPRECATION") private fun initializeSounds() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val audioAttributes = AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_ALARM) .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) .build() this.soundPool = SoundPool.Builder() .setAudioAttributes(audioAttributes) .setMaxStreams(1) .build() } else { this.soundPool = SoundPool( 1, AudioManager.STREAM_ALARM, 0) } this.soundId = this.soundPool.load( this, R.raw.two, 1 ) }
例2:MediaPlayer
手順
1)create()を使って、MediaPlayerインスタンスを生成する 2)start()を使って、音声開始する
MainActivity.kt
import android.content.DialogInterface import android.media.MediaPlayer import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity(), SimpleDialogFragment.OnClickListener { private lateinit var mediaPlayer : MediaPlayer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 1)create()を使って、MediaPlayerインスタンスを生成する mediaPlayer = MediaPlayer.create( this, R.raw.sample_sound) button.setOnClickListener { // 2)start()を使って、音声開始する mediaPlayer.start() } } }
参考文献
https://dev.classmethod.jp/articles/android-tips-48-soundpool-mediaplayer/
https://akira-watson.com/android/kotlin/soundpool-play.html
https://little-strange.hatenablog.com/entry/2019/11/10/225648
https://www.atmarkit.co.jp/ait/articles/1203/28/news128.html
関連記事
画像を表示するには
https://dk521123.hatenablog.com/entry/2013/09/28/013815
動画を再生するには
https://dk521123.hatenablog.com/entry/2013/09/30/002134