teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

9

ループを止めるメソッドを追加

2021/06/04 06:26

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,7 @@
1
1
  ### 前提(質問までに至るまでの過程)
2
2
  更新箇所
3
3
  ・一応、回答を見た後に作ったソースコードを掲載。
4
+  +ループを止めるメソッド追加
4
5
  ・本文が10000文字以上になったらしい…ので一部いらない所修正。
5
6
  ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。
6
7
  ・無音分が増えたと分かってからは毎回カットしている。
@@ -214,11 +215,6 @@
214
215
  AudioStreamは、ヘッダー等は飛ばされるような記事みた気もするけれど。
215
216
  0.051秒分飛ばして、そこからmp3の長さ-0.051秒間分ダンプ分ダンプする。
216
217
 
217
- 抽出について、この情報が合っている事前提で一応進めていく…
218
- これが合ってないと、また調べる所からになります。
219
-
220
- waveとbyteについて調べていきます。
221
-
222
218
  問題点その1 の解決策を探しています。
223
219
  未だに取っ掛かりすらありません。
224
220
 
@@ -274,6 +270,7 @@
274
270
  (ゲームで使用させて頂いています)
275
271
  色んな用途に使えるように、ファイルパスだけ渡せば
276
272
  簡易プレイヤーとして活用できるようなクラスにしました。
273
+ +ループを止めるメソッドを追加しました。
277
274
 
278
275
  ゲームの場合マルチスレッド何たら等
279
276
  書いてある記事もありましたが
@@ -341,7 +338,7 @@
341
338
  }
342
339
  }
343
340
 
344
- public void sStop() {
341
+ public void sStop() {
345
342
  try {
346
343
  clip.close();
347
344
  dataIn.close();
@@ -350,5 +347,9 @@
350
347
  e.printStackTrace();
351
348
  }
352
349
  }
350
+
351
+ public void loopStop() {
352
+ clip.loop(0);
353
+ }
353
354
  }
354
355
  ```

8

回答を見た後にソースコードを作ってみた

2021/06/04 06:26

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -270,7 +270,8 @@
270
270
  JavaでBGMをラグなくループする方法は
271
271
  oggを使うと良い事が分かりました。
272
272
 
273
- ### 一応 完成しクラス張ってみます。
273
+ ### 一応 回答を見後に作ってみました
274
+ (ゲームで使用させて頂いています)
274
275
  色んな用途に使えるように、ファイルパスだけ渡せば
275
276
  簡易プレイヤーとして活用できるようなクラスにしました。
276
277
 

7

回答後に作ったソースコードを追加

2021/06/04 06:02

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  ### 前提(質問までに至るまでの過程)
2
2
  更新箇所
3
+ ・一応、回答を見た後に作ったソースコードを掲載。
3
4
  ・本文が10000文字以上になったらしい…ので一部いらない所修正。
4
5
  ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。
5
6
  ・無音分が増えたと分かってからは毎回カットしている。

6

一応、完成したソースコードを乗せる

2021/06/04 05:59

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,46 +1,23 @@
1
1
  ### 前提(質問までに至るまでの過程)
2
+ 更新箇所
3
+ ・本文が10000文字以上になったらしい…ので一部いらない所修正。
4
+ ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。
5
+ ・無音分が増えたと分かってからは毎回カットしている。
6
+
2
7
  Java8 Eclipseを使用しています。
3
8
  外部ライブラリはmp3をJavaで扱う為のJavazoomを使用しています。
4
9
  mp3やwavファイルの曲の長さを調べる為に波形ソフトのAudacityというソフトを使用しました。
5
10
 
6
- wav
7
- MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second,
8
- サンプリング周波数は44100khz、16bit、2ch。
9
-
10
- mp3
11
- Audacityでは、長さは11.623になっていた。
12
- mp3 mediainfoというソフトにて
13
- ながさ : 11秒 650秒
14
- OBR モード : CBR モード
15
- オーバルビットレート : 192 Kbps
16
- 使用したライブラリ : LAME3.100
17
-
18
- オーディオ
19
- フォーマット : MPEG Audio
20
- バージョン : Version 1
21
- プロファイル : Layer 3
22
- 設定 : Joint stereo / MS Stereo
23
- ながさ : 11秒 651秒
24
- ビットレートモード : CBR モード
25
- ビットレート : 192 Kbps
26
- チャンネル : 2 チャンネル
27
- サンプルレート : 44.1 KHz
28
- フレームレート : 38.281 fps (1152 SPF)
29
- Compression mode : Lossy
30
- ストリームサイズ : 273 KiB (100%)
31
- 使用したライブラリ : LAME3.100
32
- エンコードライブラリの設定 : -m j -V 4 -q 3 -lowpass 18.6 -b 192
33
-
34
11
  初めてJavaでゲーム制作をしています。(ドラクエ1レベル程度の内容)
35
12
  フリー音源を集めてBGMを鳴らそうと思ったのですが
36
13
  mp3だと再生できないので、オーディオデータをwavに変換しました。
37
14
  Clipでwavを鳴らしてみると、とても簡単に実装できました。
38
15
  BGMもいつループしたのか分からない程スムーズにループしていました。
16
+ (mp3 → wavにした際、カットしてます)
39
17
 
40
18
  しかし、そこで問題が発生しました。
41
19
  容量が全部合わせて1GB以上(曲)+200MB(効果音)になりました。
42
20
  mp3だとその4分の1くらいです。
43
-
44
21
  ならば、mp3で再生できればと思い調べてみました。
45
22
 
46
23
  ①JAVAFXを使用しました。
@@ -62,6 +39,7 @@
62
39
  無音が前後に挿入されてしまうという事も知りました。
63
40
  波形ソフトで見ると、mp3→wav(その逆も)に変換したものには前後に無音が挿入されていました。
64
41
 
42
+ (変換プログラムにも、無音が挿入されてしまっていた)
65
43
  曲の長さも増えていました。全体 曲頭 曲後
66
44
  11秒623→11秒677 +0.054秒 +0.051 +0.003
67
45
  18秒099→18秒155 +0.056秒 +0.051 +0.005
@@ -125,8 +103,6 @@
125
103
  JAVAでどうカットすればいいのか、オーディオデータを取り扱っている記事が
126
104
  無く困っています。サンプルコード無いと何も出来ないへっぽこなので
127
105
  非常に困っています…
128
- 手前から1秒カットする、後ろから3秒カットする、等の記事を探していましたが
129
- 見つかりませんでした…
130
106
 
131
107
  mp3で11.623秒の曲を変換すると11.677秒になりました。差は0.054秒です。
132
108
  0.051を頭からカットします。0.054-0.051=0.003秒を曲の後ろからカットします。
@@ -229,26 +205,6 @@
229
205
  ```
230
206
 
231
207
  ### 試行錯誤中
232
- 今私が試行錯誤している事を記載していきます。
233
- 間違っていたり、それは違うよ、等ツッコミ下さい。
234
-
235
- 問題点その2・3 の解決策を探しています。
236
- wavのデータを解析していく。
237
- byteに変換して、byteを削除していく…?
238
- wavファイルの構成は
239
-
240
- 引用
241
- 「wavファイルは、次のヘッダーから必ず始まります。
242
- 文字列 RIFF (4byte)
243
- これ以降チャンクのサイズ (4byte)
244
- 文字列WAVE (4byte)
245
-
246
- チャンク
247
- チャンク名(4byte)
248
- これ以降のチャンクのサイズ(4byte)
249
- 内容」
250
- となっている。
251
-
252
208
  「EDIT40秒部分の抽出について
253
209
  デコーダの出力はpcmサンプルです。 入力が16ビットステレオ44100Hzの場合、各フレームは16ビット×2チャンネル= 4バイト、1秒は44100×4バイトです。目的の部分が始まるまで必要なだけ出力バイトをスキップし、次に44100 * 4 * 40バイトを40秒間ダンプします。モノラルにミキシングしてから8ビットにカットすることもできます。 」
254
210
 
@@ -263,17 +219,8 @@
263
219
  waveとbyteについて調べていきます。
264
220
 
265
221
  問題点その1 の解決策を探しています。
266
- mp3の長さは、Audacityだと11.623秒。
267
- wavと11.677秒
222
+ に取っ掛かりすらありません
268
- mp3を測定するプログラムだと11.677秒。
269
- 頭の無音は0.051秒
270
- 後ろの無音は…波形ソフトで測るしかない。
271
223
 
272
- ここさえ求まれば…
273
- 11.677秒から逆に11.623秒を求める事は出来るのか?
274
-
275
- ですが、未だに取っ掛かりすらありません。
276
-
277
224
  ### 補足
278
225
  プログラミングはJavaが初めてのJavaを初めて5ヵ月と31日です。
279
226
  ゲーム制作も今回が初めてです。
@@ -312,14 +259,94 @@
312
259
  との事です。
313
260
  oggもmp3と同じだと思っていました…
314
261
 
315
-
316
-
317
262
  ### 結論
318
263
  JAVAでmp3をラグなくループする方法
319
- 沢山の記事を探しましたがどれも見つかりませんでした。
264
+ 沢山の記事を探しましたが見つかりませんでした。
320
265
  wavに変換して、それを編集するくらいしか思いつきません。
321
266
  挿入される無音部分の計算も出来ていないので
322
267
  自分には難しかったみたいです。
323
268
 
324
269
  JavaでBGMをラグなくループする方法は
325
- oggを使いましょう
270
+ oggを使うと良事が分かりまし
271
+
272
+ ### 一応 完成したクラス張ってみます。
273
+ 色んな用途に使えるように、ファイルパスだけ渡せば
274
+ 簡易プレイヤーとして活用できるようなクラスにしました。
275
+
276
+ ゲームの場合マルチスレッド何たら等
277
+ 書いてある記事もありましたが
278
+ 必要になったら学ぶ予定…
279
+ ```java
280
+
281
+ /*
282
+ * MusicPlayerクラスです。
283
+ * このクラスは他プロジェクトでも汎用性があるように作られたクラスです。
284
+ * Java sound apiで再生できるデータ(wav、raw、midi)があるファイルの場所を
285
+ * コンストラクタで受け取ります。
286
+ * MusicPlayerクラスのsPlayメソッドで曲を再生します。
287
+ * MusicPlayerクラスのsStopメソッドで曲を停止します。
288
+ *
289
+ * 追伸:
290
+ * 外部ライブラリJavazoomをプロジェクトに入れるとmp3も再生されます。
291
+ * 外部ライブラリjorbisをプロジェクトに入れるとoggも再生されます。
292
+ * */
293
+
294
+ import java.io.File;
295
+ import java.io.IOException;
296
+
297
+ import javax.sound.sampled.AudioFormat;
298
+ import javax.sound.sampled.AudioInputStream;
299
+ import javax.sound.sampled.AudioSystem;
300
+ import javax.sound.sampled.Clip;
301
+ import javax.sound.sampled.LineUnavailableException;
302
+ import javax.sound.sampled.UnsupportedAudioFileException;
303
+
304
+ public class MusicPlayer {
305
+ private File musicData;
306
+ private AudioInputStream in;
307
+ private AudioInputStream dataIn;
308
+ private Clip clip;
309
+
310
+ public MusicPlayer(File musicData) {
311
+ this.musicData = musicData;
312
+ fileDataReading();
313
+ }
314
+
315
+ public void fileDataReading() {
316
+ try {
317
+ in = AudioSystem.getAudioInputStream(musicData);
318
+ } catch (UnsupportedAudioFileException | IOException e) {
319
+ e.printStackTrace();
320
+ }
321
+ AudioFormat baseFormat = in.getFormat();
322
+ AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
323
+ baseFormat.getSampleRate(), 16,
324
+ baseFormat.getChannels(),
325
+ baseFormat.getChannels() * 2,
326
+ baseFormat.getSampleRate(), false);
327
+ dataIn = AudioSystem.getAudioInputStream(targetFormat, in);
328
+ }
329
+
330
+ public void sPlay() {
331
+ try {
332
+ clip = AudioSystem.getClip();
333
+ clip.open(dataIn);
334
+ clip.loop(Clip.LOOP_CONTINUOUSLY);
335
+ } catch (LineUnavailableException e) {
336
+ e.printStackTrace();
337
+ } catch (IOException e) {
338
+ e.printStackTrace();
339
+ }
340
+ }
341
+
342
+ public void sStop() {
343
+ try {
344
+ clip.close();
345
+ dataIn.close();
346
+ in.close();
347
+ } catch (IOException e) {
348
+ e.printStackTrace();
349
+ }
350
+ }
351
+ }
352
+ ```

5

ベストアンサー前に調べたこと、試した事の情報整理

2021/06/04 05:55

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -286,4 +286,40 @@
286
286
 
287
287
  そして、もし、こんな周りくどい事をしなくても
288
288
  Javaでmp3のループ再生がラグなく出来るのでしたら
289
- 教えて頂ければ幸いです…
289
+ 教えて頂ければ幸いです…
290
+
291
+ ### ogg について
292
+ Java sound api でoggを取り扱う為のライブラリー下記2種。
293
+ JOrbis:Javaで実装されたoggファイル再生ライブラリ
294
+ JOgg:JOrbisを使用したOggファイル再生プレーヤー
295
+ を追加しまして
296
+
297
+ TN8001様のサンプルコードを実行しました。
298
+ ラグなくループ再生出来ました。
299
+
300
+
301
+ https://soundengine.jp/wordpress/tips/glossary/454/ から引用
302
+ 「非圧縮の音声ファイルに比べ、ファイルサイズを小さくできる。
303
+ 圧縮前の音を完全に再現できない。(非可逆圧縮)
304
+ ライセンスの制限が緩やかなので、PCゲームによく利用されている。
305
+ ギャップレス再生に対応」
306
+
307
+ →「ギャップレス再生に対応」
308
+
309
+ さらに引用
310
+ 「Oggは同ビットレートのMP3よりも聴感上良い音で再生でき、さらに、AACやWMAなど、他の非可逆圧縮の形式と比較しても引けを取らないようです。特に低ビットレートではその性能は高く評価されています。」
311
+
312
+ との事です。
313
+ oggもmp3と同じだと思っていました…
314
+
315
+
316
+
317
+ ### 結論
318
+ JAVAでmp3をラグなくループする方法
319
+ 沢山の記事を探しましたがどれも見つかりませんでした。
320
+ wavに変換して、それを編集するくらいしか思いつきません。
321
+ 挿入される無音部分の計算も出来ていないので
322
+ 自分には難しかったみたいです。
323
+
324
+ JavaでBGMをラグなくループする方法は
325
+ oggを使いましょう。

4

試行錯誤中 更新

2021/06/01 14:32

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -232,6 +232,7 @@
232
232
  今私が試行錯誤している事を記載していきます。
233
233
  間違っていたり、それは違うよ、等ツッコミ下さい。
234
234
 
235
+ 問題点その2・3 の解決策を探しています。
235
236
  wavのデータを解析していく。
236
237
  byteに変換して、byteを削除していく…?
237
238
  wavファイルの構成は
@@ -261,8 +262,18 @@
261
262
 
262
263
  waveとbyteについて調べていきます。
263
264
 
265
+ 問題点その1 の解決策を探しています。
266
+ mp3の長さは、Audacityだと11.623秒。
267
+ wavだと11.677秒。
268
+ mp3を測定するプログラムだと11.677秒。
269
+ 頭の無音は0.051秒
270
+ 後ろの無音は…波形ソフトで測るしかない。
264
271
 
272
+ ここさえ求まれば…
273
+ 11.677秒から逆に11.623秒を求める事は出来るのか?
265
274
 
275
+ ですが、未だに取っ掛かりすらありません。
276
+
266
277
  ### 補足
267
278
  プログラミングはJavaが初めてのJavaを初めて5ヵ月と31日です。
268
279
  ゲーム制作も今回が初めてです。

3

思考錯誤中の内容を更新

2021/06/01 09:39

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -229,6 +229,10 @@
229
229
  ```
230
230
 
231
231
  ### 試行錯誤中
232
+ 今私が試行錯誤している事を記載していきます。
233
+ 間違っていたり、それは違うよ、等ツッコミ下さい。
234
+
235
+ wavのデータを解析していく。
232
236
  byteに変換して、byteを削除していく…?
233
237
  wavファイルの構成は
234
238
 
@@ -247,14 +251,18 @@
247
251
  「EDIT40秒部分の抽出について
248
252
  デコーダの出力はpcmサンプルです。 入力が16ビットステレオ44100Hzの場合、各フレームは16ビット×2チャンネル= 4バイト、1秒は44100×4バイトです。目的の部分が始まるまで必要なだけ出力バイトをスキップし、次に44100 * 4 * 40バイトを40秒間ダンプします。モノラルにミキシングしてから8ビットにカットすることもできます。 」
249
253
 
254
+ 44100Hz、2ch、16ビットはそのままなので問題はないはず。
250
255
  との事で、内容までのbyteを飛ばして、無音分を計算し飛ばす。
251
256
  AudioStreamは、ヘッダー等は飛ばされるような記事みた気もするけれど。
252
257
  0.051秒分飛ばして、そこからmp3の長さ-0.051秒間分ダンプ分ダンプする。
253
258
 
254
- byteについて調べていく
259
+ 抽出について、この情報が合っている事前提で一応進めてい
255
- +何故か更新したはずなのに更新されてないので
260
+ が合ってないと、また調べる所からになります。
256
- もう一度更新。
257
261
 
262
+ waveとbyteについて調べていきます。
263
+
264
+
265
+
258
266
  ### 補足
259
267
  プログラミングはJavaが初めてのJavaを初めて5ヵ月と31日です。
260
268
  ゲーム制作も今回が初めてです。

2

思考錯誤中を追加

2021/06/01 09:34

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -228,6 +228,33 @@
228
228
 
229
229
  ```
230
230
 
231
+ ### 試行錯誤中
232
+ byteに変換して、byteを削除していく…?
233
+ wavファイルの構成は
234
+
235
+ 引用
236
+ 「wavファイルは、次のヘッダーから必ず始まります。
237
+ 文字列 RIFF (4byte)
238
+ これ以降チャンクのサイズ (4byte)
239
+ 文字列WAVE (4byte)
240
+
241
+ チャンク
242
+ チャンク名(4byte)
243
+ これ以降のチャンクのサイズ(4byte)
244
+ 内容」
245
+ となっている。
246
+
247
+ 「EDIT40秒部分の抽出について
248
+ デコーダの出力はpcmサンプルです。 入力が16ビットステレオ44100Hzの場合、各フレームは16ビット×2チャンネル= 4バイト、1秒は44100×4バイトです。目的の部分が始まるまで必要なだけ出力バイトをスキップし、次に44100 * 4 * 40バイトを40秒間ダンプします。モノラルにミキシングしてから8ビットにカットすることもできます。 」
249
+
250
+ との事で、内容までのbyteを飛ばして、無音分を計算し飛ばす。
251
+ AudioStreamは、ヘッダー等は飛ばされるような記事みた気もするけれど。
252
+ 0.051秒分飛ばして、そこからmp3の長さ-0.051秒間分ダンプ分ダンプする。
253
+
254
+ byteについて調べていく。
255
+ +何故か更新したはずなのに更新されていないので
256
+ もう一度更新。
257
+
231
258
  ### 補足
232
259
  プログラミングはJavaが初めてのJavaを初めて5ヵ月と31日です。
233
260
  ゲーム制作も今回が初めてです。

1

mp3の情報の追加。cbrに変換してもmp3の長さではなかった。

2021/06/01 09:25

投稿

pea-cap
pea-cap

スコア4

title CHANGED
File without changes
body CHANGED
@@ -7,6 +7,30 @@
7
7
  MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second,
8
8
  サンプリング周波数は44100khz、16bit、2ch。
9
9
 
10
+ mp3
11
+ Audacityでは、長さは11.623になっていた。
12
+ mp3 mediainfoというソフトにて
13
+ ながさ : 11秒 650秒
14
+ OBR モード : CBR モード
15
+ オーバルビットレート : 192 Kbps
16
+ 使用したライブラリ : LAME3.100
17
+
18
+ オーディオ
19
+ フォーマット : MPEG Audio
20
+ バージョン : Version 1
21
+ プロファイル : Layer 3
22
+ 設定 : Joint stereo / MS Stereo
23
+ ながさ : 11秒 651秒
24
+ ビットレートモード : CBR モード
25
+ ビットレート : 192 Kbps
26
+ チャンネル : 2 チャンネル
27
+ サンプルレート : 44.1 KHz
28
+ フレームレート : 38.281 fps (1152 SPF)
29
+ Compression mode : Lossy
30
+ ストリームサイズ : 273 KiB (100%)
31
+ 使用したライブラリ : LAME3.100
32
+ エンコードライブラリの設定 : -m j -V 4 -q 3 -lowpass 18.6 -b 192
33
+
10
34
  初めてJavaでゲーム制作をしています。(ドラクエ1レベル程度の内容)
11
35
  フリー音源を集めてBGMを鳴らそうと思ったのですが
12
36
  mp3だと再生できないので、オーディオデータをwavに変換しました。
@@ -77,18 +101,22 @@
77
101
  ### 発生している問題・エラーメッセージ・試したこと
78
102
  問題点その1
79
103
  mp3をAudacityで測定すると曲は11.623秒と表示されます。
80
- しかし、music.info でmp3を見ると11秒650と表示されます。
104
+ しかし、Mediainfoというソフトでmp3を見ると11秒650と表示されます。
105
+
81
106
  Javaでmp3の曲の長さを調べるプログラムが記事に載っていたので試すと
82
107
  (外部ライブラリJavazoom必要かも…)
83
108
  File file = new File("filename.mp3");
84
109
  AudioFileFormat baseFileFormat = new MpegAudioFileReader().getAudioFileFormat(file);
85
110
  Map properties = baseFileFormat.properties();
86
111
  Long duration = (Long) properties.get("duration");
87
- duration = 11651000 と表示されます。11.651秒?
88
- 正確に11.623秒と求めたいのですが、Java sound api の標準のメソッドを
89
- 用いても-1と出ます。その為の上のプログラムなのですが思っていた値と違うようで…
90
- 他の方法を調べても、他にありませんでした…
91
112
 
113
+ duration = 11677000になりました。
114
+ なりましたが…それはwavに変換した際のAudacityで調べた長さと一緒でした。
115
+ 変換前の値は11.623秒なので、mp3の長さが
116
+ duration = 11623000となってほしいです…
117
+ Javaでmp3の取り扱いが少なく、さらに曲の長さを求めるサンプルコードは
118
+ これくらいしかありませんでした…(Java sound api のメソッドだと-1になる)
119
+
92
120
  問題点その2と3
93
121
  曲の頭から 0.051秒カット
94
122
  曲の後ろから wavの長さ - mp3の長さ - 0.051 秒分をカット