質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1211閲覧

Kotlin AudioTrackで内部ファイルを再生したい

HYDESA

総合スコア8

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/09/24 02:35

前提・実現したいこと

いつもお世話になっています。
現在、Androidアプリを作成しながら勉強しています。
AudioTrackで、Waveファイルを再生する方法を模索しています。

ストリーム系だとAudioTrackが良いとの事でしたので勉強しておりますが、
参考見分があまりなく、Java見分を変換しながらソースを作成しています。

ところが、AudioTrackの生成から音楽データの書き込みをするところで
ByteArray形式で求められますが、どうしてもByteArray形式で書き込む方法がわかりません。

発生している問題・エラーメッセージ

audioTrack.write(waveData, offset , bufSize - offset)

該当のソースコード

kotlin

1val rate = 44100 2val bufSize = 212922 // waveファイルサイズ 3val offset = 46 // ヘッダーサイズ 4val waveData = filesDir.path + "/0123.wav" // ファイルはアプリのプライベートストレージに保存 5 6val audioTrack = AudioTrack.Builder() 7 .setAudioAttributes( 8 AudioAttributes.Builder() 9 .setUsage(AudioAttributes.USAGE_MEDIA) 10 .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) 11 .build() 12 ) 13 .setAudioFormat( 14 AudioFormat.Builder() 15 .setEncoding(AudioFormat.ENCODING_PCM_16BIT) 16 .setSampleRate(rate) 17 .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) 18 .build() 19 ) 20 .setBufferSizeInBytes(bufSize) 21 .setTransferMode(AudioTrack.MODE_STREAM) 22 .build() 23 24audioTrack.play() 25audioTrack.write(waveData, offset, bufSize - offset) 26// waveDataをByteArray形式でセットしないといけない

MediaPlayerだと再生されますが、
どうしてもAudioTrackで再生したいです。

また、ネットだとR.raw指定での方法が記述されているのですが、
自分が使うと赤い波線でエラーになってしまいます。
(ファイルはセットしてあるのですが...)

とりあえずプライベートストレージ内のwaveファイルを再生したいです。

どのようにすればよろしいでしょうか。
申し訳ありませんが、ご教示くださいませ。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HYDESA

2021/09/24 07:27

hoshi-takanoriさん、ご教示ありがとうございます。 ここのサイトは自分も確認してまして、ただ配列セットが Kotlinだとどうやってやればよいか、わからない状況です。 Java: input = getResources().openRawResource(R.raw.audio_sample); wavData = new byte[input.available()]; Kotlin: val waveData = filesDir.path + "/0123.wav" ...? お分かりでしたらご教示くださいますと、嬉しいです。 よろしくお願い致します。
hoshi-takanori

2021/09/24 07:40

とりあえずこれでいけるかも? (いいのかなぁ) val waveData = File(filesDir.path + "/0123.wav").readBytes()
HYDESA

2021/09/24 08:59 編集

hoshi-takanoriさん、ありがとうございます。 早速上記を追記してやってみましたが、 エラーは出ませんでしたが、音も出ませんでした。 (Windowsのサウンドはしていますのでデバイスの問題ではないです) なかなかに難しいですね。
guest

回答1

0

自己解決

お世話になります。
どれだけやってもaudioTrackで再生が出来ず
(エラーも無くサウンドしません)
R.rawを使ってもうんともすんとも発しないので、
とりあえずsoundPoolを勉強して再生が出来ました。

この質問はクロースしますが、再生出来たソースをあげておきます。

ポイントは、そのまま再生するとSample 1 not READYエラーが出るので
setOnLoadCompleteListener を使用すると再生されるそうです。
※keyorisさんありがとう! https://qiita.com/keyoris/items/bdc7b097d021cea00ae4

kotlin

1fun soundPool(){ 2 var sp: SoundPool 3 4 val audioAttr = AudioAttributes.Builder() 5 .setUsage(AudioAttributes.USAGE_MEDIA) 6 .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) 7 .build() 8 sp = SoundPool.Builder() 9 .setAudioAttributes(audioAttr) 10 .setMaxStreams(1) 11 .build() 12 val rtn = sp.load(this, R.raw.testwave, 1) 13 sp.setOnLoadCompleteListener{ sp, sampleId, status -> 14 if(status == 0){ 15 sp.play(sampleId, 1.0f, 1.0f, 0, 0, 1.0f) 16 } 17 } 18}

またよろしくお願い致します。

投稿2021/09/30 03:06

HYDESA

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問