ExoplayerでFFMpegExtentionとギャップレス再生

Exoplayerの簡単な音楽プレイヤーサンプルを元に改造して、FFMpegExtentionを有効にして、さらにギャップレス再生を試みたので記録しておく

FFMpegExtentionの有効化

プロジェクトにFile→New→New ModuleからAndroid Libraryを選択して追加する。名前だけわかりやすく「ffmpeg」としておいた。ファイルはexoplayerのサンプルのextention-ffmpegの下から丸ごとコピーしておく

次はビルドであるが、私はWindows環境でAndroid Studioを使っている。Readme.mdによると、Windows環境でのビルドは不可能というかサポート無しとなっている。Power shellを使ったらできるのではないか?などという記述もあるが、環境変数、特に配列の環境変数がわからなかったので、VirtualBoxのLinuxでビルドした。

ドキュメント通りで問題ないのであるが、私は最後のコマンド、

cd “$(FFMPEG_EXT_PATH)” && \

$(NDK_PATH)/ndk_build APP_ABI=”armeabi-v7a arm64-v8a x86 x86_64″ -j4

を実行するのを長いこと見落としはまっていたので、ドキュメントは最後まで読みましょうというのを備忘録として残しておきたい。このコマンドは一瞬で終わる。そして、src/main/libsディレクトリが作られ、その下に、コマンドラインで指定した4つのディレクトリが作られライブラリの実体(.soファイル)が置かれる。このlibsディレクトリをWindows環境にそのままコピーすると使うことができる。

アプリケーションからextentionを使うには、build.gradleファイルの編集が必要である。サンプルアプリではビルドオプションで切り替えられるようだが、どういう仕組みになっているか読み解けていない。次の追加でextension(ライブラリ)が使えるようになる。

dependencies {
implementation project(":ffmpeg")
}

FFMpegExtentionを使うには、先のサンプルアプリで、SimpleExoplayerを使っているところを修正する。次のコードで使われるようになる。

audioPlayer = ExoPlayer.Builder(this, FfmpegAudioRenderer()).build()

私はndk-buildの時に、MP3, AAC, ALAC, FLACを有効化し、AAC(m4a), ALAC(m4a), FLACの再生を確認している。

ギャップレス再生

ギャップレス再生を実行するにはConcatenatingMediaSouceクラスを使うことになる。先のサンプルのbuildMediaSource()メソッドを次のように書き換える。

private fun buildMediaSource(): ConcatenatingMediaSource? {

return try {
      var file:File = File(playlist.getItemAt(trackNo++))
      val dataSpec = DataSpec(Uri.fromFile(file))
val fileDataSource = FileDataSource()
try {
fileDataSource.open(dataSpec)
} catch (e: FileDataSourceException) {
e.printStackTrace()
}
val factory =
DataSource.Factory { fileDataSource }

ConcatenatingMediaSource(
ProgressiveMediaSource.Factory(factory).createMediaSource(fileDataSource.uri)
)
} catch (e: Exception) {
null
}
}

私は仮に、m3u8プレイリストのクラスを作っているので、それからファイルパスを取得している。ファイルパスからURIを取得して、ファイルデータソースにして、先のメディアソースに設定している。一ファイルだけだとギャップレスにならないので、複数ファイルを設定し、適宜、addMediaSourceメソッドを呼び出せばギャップレス再生は続いていく。私は再生開始時に2トラックか3トラックを追加し、後はトラックチェンジイベントで追加していって、プレイリストの終わりまでギャップレス再生を確認している。

まとめ

まとめと言っても内容にまとまりがなく、Exoplayerについて、ここ数週間勉強したことを書き留めてみた。どちらも将来完成したら私のアプリで必須になる項目である。いつの日かアプリを完成させたい。

コメント