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

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

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

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

Q&A

解決済

1回答

954閲覧

wav音源をint配列に変換する

ryu-sei

総合スコア12

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

0グッド

0クリップ

投稿2021/04/04 06:59

前提・実現したいこと

https://qiita.com/goodclues/items/67a20140fd7c205872d6
https://qiita.com/k-yamada-github/items/499b774fcf1f2d6ec611
の2サイトを参考にwav音源のByte配列をint配列に変換してリストで表示しようとしています。エラーははかれてないのですがアプリを起動しようとすると強制終了してしまいます。改善策がわかる方いらっしゃらないでしょうか。

該当のソースコード

kotlin

1import android.os.Build 2import android.os.Bundle 3import android.util.Log 4import android.widget.ArrayAdapter 5import android.widget.ListView 6import androidx.annotation.RequiresApi 7import androidx.appcompat.app.AppCompatActivity 8import java.io.InputStream 9import java.nio.ByteBuffer 10import java.util.* 11import kotlin.experimental.and 12 13 14class MainActivity : AppCompatActivity() { 15 private val `is`: InputStream = resources.openRawResource(R.raw.test3) 16 private var wavData = ByteArray(`is`.available()) 17 18 @RequiresApi(Build.VERSION_CODES.LOLLIPOP) 19 override fun onCreate(savedInstanceState: Bundle?) { 20 super.onCreate(savedInstanceState) 21 setContentView(R.layout.activity_main) 22 23 try { 24 val readBytes: String = 25 java.lang.String.format(Locale.US, "read bytes = %d", `is`.read(wavData)) 26 Log.e(TAG, readBytes) 27 `is`.close() 28 }catch (e: Exception){ 29 println(e) 30 } 31 32 var fmtIdx = 0 33 for (i in 0 until wavData.size - 4) { 34 if (wavData[i] == 0x66.toByte() && wavData[i+1] == 0x6d.toByte() && wavData[i+2] == 0x74.toByte() && wavData[i+3] == 0x20.toByte() 35 ) { // 'fmt ' chunk 36 fmtIdx = i 37 Log.i("Test", "fmtIdx:$fmtIdx") 38 break 39 } 40 } 41 if (fmtIdx == 0) { 42 Log.e(TAG, "No fmt chunk") 43 } 44 45 var dataIdx = 0 46 for (i in 0 until wavData.size - 4) { 47 if (wavData[i] == 0x64.toByte() && wavData[i+1] == 0x61.toByte() && wavData[i+2] == 0x74.toByte() && wavData[i+3] == 0x61.toByte() 48 ) { // 'data' chunk 49 dataIdx = i 50 Log.i("Test", "dataIdx:$dataIdx") 51 break 52 } 53 } 54 if (dataIdx == 0) { 55 Log.e(TAG, "No data chunk") 56 } 57 58 val wavChannel = wavData[fmtIdx + 10].toInt() 59 Log.i("Test", "wavChannel:$wavChannel") 60 61 //int wavSamplingRate = ((int)(wavData[fmtIdx + 15]) << 24) + ((int)(wavData[fmtIdx + 14]) << 16) 62 // + ((int)(wavData[fmtIdx + 13]) << 8) + (int)(wavData[fmtIdx + 12]); 63 // ↑の書き方はよくなさそうなので修正 64 val bytes1 = byteArrayOf( 65 wavData[fmtIdx + 15], 66 wavData[fmtIdx + 14], wavData[fmtIdx + 13], wavData[fmtIdx + 12] 67 ) 68 val wavSamplingRate: Int = ByteBuffer.wrap(bytes1).int 69 70 Log.i("Test", "wavSamplingRate:$wavSamplingRate") 71 72 val wavByte = wavData[fmtIdx + 22].toInt() / 8 73 Log.i("Test", "wavByte:$wavByte") 74 75 //int wavDataSize = ((int)(wavData[dataIdx + 7]) << 24) + ((int)(wavData[dataIdx + 6]) << 16) 76 // + ((int)(wavData[dataIdx + 5]) << 8) + (int)(wavData[dataIdx + 4]); 77 78 val bytes2 = byteArrayOf( 79 wavData[dataIdx + 7], 80 wavData[dataIdx + 6], wavData[dataIdx + 5], wavData[dataIdx + 4] 81 ) 82 val wavDataSize: Int = ByteBuffer.wrap(bytes2).int 83 84 Log.i("Test", "wavDataSize:$wavDataSize") 85 86 val wavHeaderSize = dataIdx + 8 87 88 val musicDataRight = IntArray(wavDataSize / wavByte / wavChannel) 89 val musicDataLeft = IntArray(wavDataSize / wavByte / wavChannel) 90 91 val bytestemp = byteArrayOf(0, 0, 0, 0) // 4byteないとBufferUnderflowExceptionになる 92 93 if (wavByte == 1 && wavChannel == 1) { 94 var i = 0 95 var j = wavHeaderSize 96 while (i < musicDataRight.size) { 97 musicDataRight[i] = wavData[j].toInt() 98 musicDataLeft[i] = wavData[j].toInt() 99 i++ 100 j++ 101 } 102 } else if (wavByte == 1 && wavChannel == 2) { 103 var i = 0 104 var j = wavHeaderSize 105 while (i < musicDataRight.size) { 106 musicDataRight[i] = wavData[j].toInt() 107 musicDataLeft[i] = wavData[j + 1].toInt() 108 i++ 109 j += 2 110 } 111 } else if (wavByte == 2 && wavChannel == 1) { 112 var i = 0 113 var j = wavHeaderSize 114 while (i < musicDataRight.size) { 115 116 //musicDataRight[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 117 //musicDataLeft[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 118 bytestemp[2] = wavData[j + 1] 119 bytestemp[3] = wavData[j] 120 musicDataRight[i] = ByteBuffer.wrap(bytestemp).int 121 musicDataLeft[i] = ByteBuffer.wrap(bytestemp).int 122 i++ 123 j += 2 124 } 125 } else if (wavByte == 2 && wavChannel == 2) { 126 var i = 0 127 var j = wavHeaderSize 128 while (i < musicDataRight.size) { 129 130 //musicDataRight[i] = ((int)wavData[j + 1] << 8) + (int)wavData[j]; 131 //musicDataLeft[i] = ((int)wavData[j + 3] << 8) + (int)wavData[j + 2]; 132 bytestemp[2] = wavData[j + 1] 133 bytestemp[3] = wavData[j] 134 musicDataRight[i] = ByteBuffer.wrap(bytestemp).int 135 bytestemp[2] = wavData[j + 3] 136 bytestemp[3] = wavData[j + 2] 137 musicDataLeft[i] = ByteBuffer.wrap(bytestemp).int 138 i++ 139 j += 4 140 } 141 } 142 143 144 byteArrayToInt(wavData)//ここから 145 var intListArray = arrayListOf<Int>() 146 val listView = findViewById<ListView>(R.id.list_view) 147 148 val size = wavData.size 149 var i =0 150 repeat(size){ 151 intListArray.add(wavData[i].toInt()) 152 i++ 153 } 154 155 val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, intListArray) 156 157 listView.adapter = adapter//ここまで 158 159 } 160 private fun byteArrayToInt(byteArray: ByteArray): Int { 161 var result = 0 162 for (i in 0..3) { 163 result = result shl 8 164 result = result or (byteArray[i] and 0xFF.toByte()).toInt() 165 } 166 return result 167 } 168 companion object { 169 private const val TAG = "ClassName" 170 } 171}

試したこと

コード内でここからここまでと書いた部分を消して実行したのですがそのときも強制終了しました。

補足情報(FW/ツールのバージョンなど)

音声ファイルのデータです
イメージ説明

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

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

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

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

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

y_waiwai

2021/04/04 07:07

ブレークポイントを設定するなりして、どこまで実行できているのか、どこで落ちるのか探っていきましょう
hoshi-takanori

2021/04/04 07:38

Android の場合は Logcat で落ちてる場所と理由を確認するのが良いかと。 https://developer.android.com/studio/debug/am-logcat?hl=ja というか、たぶん次の行のせいでしょう。MainActivity オブジェクトを生成する時点ではリソースにアクセスできませんので、onCreate に移動すればいいはず。 private val `is`: InputStream = resources.openRawResource(R.raw.test3)
ryu-sei

2021/04/04 07:57

お二方ともありがとうございました。 hoshi-takanoriさんのおっしゃるとおりのやり方で解決しました。
guest

回答1

0

自己解決

private val is: InputStream = resources.openRawResource(R.raw.test3)
をonCreate内に入れることで解決しました。

投稿2021/04/04 07:58

ryu-sei

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問