質問編集履歴

9

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

2021/06/04 06:26

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  ・一応、回答を見た後に作ったソースコードを掲載。
6
6
 
7
+  +ループを止めるメソッド追加
8
+
7
9
  ・本文が10000文字以上になったらしい…ので一部いらない所修正。
8
10
 
9
11
  ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。
@@ -430,16 +432,6 @@
430
432
 
431
433
 
432
434
 
433
- 抽出について、この情報が合っている事前提で一応進めていく…
434
-
435
- これが合ってないと、また調べる所からになります。
436
-
437
-
438
-
439
- waveとbyteについて調べていきます。
440
-
441
-
442
-
443
435
  問題点その1 の解決策を探しています。
444
436
 
445
437
  未だに取っ掛かりすらありません。
@@ -550,6 +542,8 @@
550
542
 
551
543
  簡易プレイヤーとして活用できるようなクラスにしました。
552
544
 
545
+ +ループを止めるメソッドを追加しました。
546
+
553
547
 
554
548
 
555
549
  ゲームの場合マルチスレッド何たら等
@@ -684,7 +678,7 @@
684
678
 
685
679
 
686
680
 
687
- public void sStop() {
681
+ public void sStop() {
688
682
 
689
683
  try {
690
684
 
@@ -702,6 +696,14 @@
702
696
 
703
697
  }
704
698
 
699
+
700
+
701
+ public void loopStop() {
702
+
703
+ clip.loop(0);
704
+
705
+ }
706
+
705
707
  }
706
708
 
707
709
  ```

8

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

2021/06/04 06:26

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -542,7 +542,9 @@
542
542
 
543
543
 
544
544
 
545
- ### 一応 完成しクラス張ってみます。
545
+ ### 一応 回答を見後に作ってみました
546
+
547
+ (ゲームで使用させて頂いています)
546
548
 
547
549
  色んな用途に使えるように、ファイルパスだけ渡せば
548
550
 

7

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

2021/06/04 06:02

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  更新箇所
4
4
 
5
+ ・一応、回答を見た後に作ったソースコードを掲載。
6
+
5
7
  ・本文が10000文字以上になったらしい…ので一部いらない所修正。
6
8
 
7
9
  ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。

6

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

2021/06/04 05:59

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,15 @@
1
1
  ### 前提(質問までに至るまでの過程)
2
2
 
3
+ 更新箇所
4
+
5
+ ・本文が10000文字以上になったらしい…ので一部いらない所修正。
6
+
7
+ ・一番最初のwav → mp3へと変換した際にカットしている事を伝え忘れていた。
8
+
9
+ ・無音分が増えたと分かってからは毎回カットしている。
10
+
11
+
12
+
3
13
  Java8 Eclipseを使用しています。
4
14
 
5
15
  外部ライブラリはmp3をJavaで扱う為のJavazoomを使用しています。
@@ -8,62 +18,6 @@
8
18
 
9
19
 
10
20
 
11
- wav
12
-
13
- MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second,
14
-
15
- サンプリング周波数は44100khz、16bit、2ch。
16
-
17
-
18
-
19
- mp3
20
-
21
- Audacityでは、長さは11.623になっていた。
22
-
23
- mp3 mediainfoというソフトにて
24
-
25
- ながさ : 11秒 650秒
26
-
27
- OBR モード : CBR モード
28
-
29
- オーバルビットレート : 192 Kbps
30
-
31
- 使用したライブラリ : LAME3.100
32
-
33
-
34
-
35
- オーディオ
36
-
37
- フォーマット : MPEG Audio
38
-
39
- バージョン : Version 1
40
-
41
- プロファイル : Layer 3
42
-
43
- 設定 : Joint stereo / MS Stereo
44
-
45
- ながさ : 11秒 651秒
46
-
47
- ビットレートモード : CBR モード
48
-
49
- ビットレート : 192 Kbps
50
-
51
- チャンネル : 2 チャンネル
52
-
53
- サンプルレート : 44.1 KHz
54
-
55
- フレームレート : 38.281 fps (1152 SPF)
56
-
57
- Compression mode : Lossy
58
-
59
- ストリームサイズ : 273 KiB (100%)
60
-
61
- 使用したライブラリ : LAME3.100
62
-
63
- エンコードライブラリの設定 : -m j -V 4 -q 3 -lowpass 18.6 -b 192
64
-
65
-
66
-
67
21
  初めてJavaでゲーム制作をしています。(ドラクエ1レベル程度の内容)
68
22
 
69
23
  フリー音源を集めてBGMを鳴らそうと思ったのですが
@@ -74,6 +28,8 @@
74
28
 
75
29
  BGMもいつループしたのか分からない程スムーズにループしていました。
76
30
 
31
+ (mp3 → wavにした際、カットしてます)
32
+
77
33
 
78
34
 
79
35
  しかし、そこで問題が発生しました。
@@ -82,8 +38,6 @@
82
38
 
83
39
  mp3だとその4分の1くらいです。
84
40
 
85
-
86
-
87
41
  ならば、mp3で再生できればと思い調べてみました。
88
42
 
89
43
 
@@ -126,6 +80,8 @@
126
80
 
127
81
 
128
82
 
83
+ (変換プログラムにも、無音が挿入されてしまっていた)
84
+
129
85
  曲の長さも増えていました。全体 曲頭 曲後
130
86
 
131
87
  11秒623→11秒677 +0.054秒 +0.051 +0.003
@@ -252,10 +208,6 @@
252
208
 
253
209
  非常に困っています…
254
210
 
255
- 手前から1秒カットする、後ろから3秒カットする、等の記事を探していましたが
256
-
257
- 見つかりませんでした…
258
-
259
211
 
260
212
 
261
213
  mp3で11.623秒の曲を変換すると11.677秒になりました。差は0.054秒です。
@@ -460,46 +412,6 @@
460
412
 
461
413
  ### 試行錯誤中
462
414
 
463
- 今私が試行錯誤している事を記載していきます。
464
-
465
- 間違っていたり、それは違うよ、等ツッコミ下さい。
466
-
467
-
468
-
469
- 問題点その2・3 の解決策を探しています。
470
-
471
- wavのデータを解析していく。
472
-
473
- byteに変換して、byteを削除していく…?
474
-
475
- wavファイルの構成は
476
-
477
-
478
-
479
- 引用
480
-
481
- 「wavファイルは、次のヘッダーから必ず始まります。
482
-
483
- 文字列 RIFF (4byte)
484
-
485
- これ以降チャンクのサイズ (4byte)
486
-
487
- 文字列WAVE (4byte)
488
-
489
-
490
-
491
- チャンク
492
-
493
- チャンク名(4byte)
494
-
495
- これ以降のチャンクのサイズ(4byte)
496
-
497
- 内容」
498
-
499
- となっている。
500
-
501
-
502
-
503
415
  「EDIT40秒部分の抽出について
504
416
 
505
417
  デコーダの出力はpcmサンプルです。 入力が16ビットステレオ44100Hzの場合、各フレームは16ビット×2チャンネル= 4バイト、1秒は44100×4バイトです。目的の部分が始まるまで必要なだけ出力バイトをスキップし、次に44100 * 4 * 40バイトを40秒間ダンプします。モノラルにミキシングしてから8ビットにカットすることもできます。 」
@@ -528,25 +440,7 @@
528
440
 
529
441
  問題点その1 の解決策を探しています。
530
442
 
531
- mp3の長さは、Audacityだと11.623秒。
532
-
533
- wavだと11.677秒。
534
-
535
- mp3を測定するプログラムだと11.677秒。
536
-
537
- 頭の無音は0.051秒
538
-
539
- 後ろの無音は…波形ソフトで測るしかない。
540
-
541
-
542
-
543
- ここさえ求まれば…
544
-
545
- 11.677秒から逆に11.623秒を求める事は出来るのか?
546
-
547
-
548
-
549
- ですが、未だに取っ掛かりすらありません。
443
+ 未だに取っ掛かりすらありません。
550
444
 
551
445
 
552
446
 
@@ -626,15 +520,11 @@
626
520
 
627
521
 
628
522
 
629
-
630
-
631
-
632
-
633
523
  ### 結論
634
524
 
635
525
  JAVAでmp3をラグなくループする方法
636
526
 
637
- 沢山の記事を探しましたがどれも見つかりませんでした。
527
+ 沢山の記事を探しましたが見つかりませんでした。
638
528
 
639
529
  wavに変換して、それを編集するくらいしか思いつきません。
640
530
 
@@ -646,4 +536,168 @@
646
536
 
647
537
  JavaでBGMをラグなくループする方法は
648
538
 
649
- oggを使いましょう
539
+ oggを使うと良事が分かりまし
540
+
541
+
542
+
543
+ ### 一応 完成したクラス張ってみます。
544
+
545
+ 色んな用途に使えるように、ファイルパスだけ渡せば
546
+
547
+ 簡易プレイヤーとして活用できるようなクラスにしました。
548
+
549
+
550
+
551
+ ゲームの場合マルチスレッド何たら等
552
+
553
+ 書いてある記事もありましたが
554
+
555
+ 必要になったら学ぶ予定…
556
+
557
+ ```java
558
+
559
+
560
+
561
+ /*
562
+
563
+ * MusicPlayerクラスです。
564
+
565
+ * このクラスは他プロジェクトでも汎用性があるように作られたクラスです。
566
+
567
+ * Java sound apiで再生できるデータ(wav、raw、midi)があるファイルの場所を
568
+
569
+ * コンストラクタで受け取ります。
570
+
571
+ * MusicPlayerクラスのsPlayメソッドで曲を再生します。
572
+
573
+ * MusicPlayerクラスのsStopメソッドで曲を停止します。
574
+
575
+ *
576
+
577
+ * 追伸:
578
+
579
+ * 外部ライブラリJavazoomをプロジェクトに入れるとmp3も再生されます。
580
+
581
+ * 外部ライブラリjorbisをプロジェクトに入れるとoggも再生されます。
582
+
583
+ * */
584
+
585
+
586
+
587
+ import java.io.File;
588
+
589
+ import java.io.IOException;
590
+
591
+
592
+
593
+ import javax.sound.sampled.AudioFormat;
594
+
595
+ import javax.sound.sampled.AudioInputStream;
596
+
597
+ import javax.sound.sampled.AudioSystem;
598
+
599
+ import javax.sound.sampled.Clip;
600
+
601
+ import javax.sound.sampled.LineUnavailableException;
602
+
603
+ import javax.sound.sampled.UnsupportedAudioFileException;
604
+
605
+
606
+
607
+ public class MusicPlayer {
608
+
609
+ private File musicData;
610
+
611
+ private AudioInputStream in;
612
+
613
+ private AudioInputStream dataIn;
614
+
615
+ private Clip clip;
616
+
617
+
618
+
619
+ public MusicPlayer(File musicData) {
620
+
621
+ this.musicData = musicData;
622
+
623
+ fileDataReading();
624
+
625
+ }
626
+
627
+
628
+
629
+ public void fileDataReading() {
630
+
631
+ try {
632
+
633
+ in = AudioSystem.getAudioInputStream(musicData);
634
+
635
+ } catch (UnsupportedAudioFileException | IOException e) {
636
+
637
+ e.printStackTrace();
638
+
639
+ }
640
+
641
+ AudioFormat baseFormat = in.getFormat();
642
+
643
+ AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
644
+
645
+ baseFormat.getSampleRate(), 16,
646
+
647
+ baseFormat.getChannels(),
648
+
649
+ baseFormat.getChannels() * 2,
650
+
651
+ baseFormat.getSampleRate(), false);
652
+
653
+ dataIn = AudioSystem.getAudioInputStream(targetFormat, in);
654
+
655
+ }
656
+
657
+
658
+
659
+ public void sPlay() {
660
+
661
+ try {
662
+
663
+ clip = AudioSystem.getClip();
664
+
665
+ clip.open(dataIn);
666
+
667
+ clip.loop(Clip.LOOP_CONTINUOUSLY);
668
+
669
+ } catch (LineUnavailableException e) {
670
+
671
+ e.printStackTrace();
672
+
673
+ } catch (IOException e) {
674
+
675
+ e.printStackTrace();
676
+
677
+ }
678
+
679
+ }
680
+
681
+
682
+
683
+ public void sStop() {
684
+
685
+ try {
686
+
687
+ clip.close();
688
+
689
+ dataIn.close();
690
+
691
+ in.close();
692
+
693
+ } catch (IOException e) {
694
+
695
+ e.printStackTrace();
696
+
697
+ }
698
+
699
+ }
700
+
701
+ }
702
+
703
+ ```

5

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

2021/06/04 05:55

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -575,3 +575,75 @@
575
575
  Javaでmp3のループ再生がラグなく出来るのでしたら
576
576
 
577
577
  教えて頂ければ幸いです…
578
+
579
+
580
+
581
+ ### ogg について
582
+
583
+ Java sound api でoggを取り扱う為のライブラリー下記2種。
584
+
585
+ JOrbis:Javaで実装されたoggファイル再生ライブラリ
586
+
587
+ JOgg:JOrbisを使用したOggファイル再生プレーヤー
588
+
589
+ を追加しまして
590
+
591
+
592
+
593
+ TN8001様のサンプルコードを実行しました。
594
+
595
+ ラグなくループ再生出来ました。
596
+
597
+
598
+
599
+
600
+
601
+ https://soundengine.jp/wordpress/tips/glossary/454/ から引用
602
+
603
+ 「非圧縮の音声ファイルに比べ、ファイルサイズを小さくできる。
604
+
605
+ 圧縮前の音を完全に再現できない。(非可逆圧縮)
606
+
607
+ ライセンスの制限が緩やかなので、PCゲームによく利用されている。
608
+
609
+ ギャップレス再生に対応」
610
+
611
+
612
+
613
+ →「ギャップレス再生に対応」
614
+
615
+
616
+
617
+ さらに引用
618
+
619
+ 「Oggは同ビットレートのMP3よりも聴感上良い音で再生でき、さらに、AACやWMAなど、他の非可逆圧縮の形式と比較しても引けを取らないようです。特に低ビットレートではその性能は高く評価されています。」
620
+
621
+
622
+
623
+ との事です。
624
+
625
+ oggもmp3と同じだと思っていました…
626
+
627
+
628
+
629
+
630
+
631
+
632
+
633
+ ### 結論
634
+
635
+ JAVAでmp3をラグなくループする方法
636
+
637
+ 沢山の記事を探しましたがどれも見つかりませんでした。
638
+
639
+ wavに変換して、それを編集するくらいしか思いつきません。
640
+
641
+ 挿入される無音部分の計算も出来ていないので
642
+
643
+ 自分には難しかったみたいです。
644
+
645
+
646
+
647
+ JavaでBGMをラグなくループする方法は
648
+
649
+ oggを使いましょう。

4

試行錯誤中 更新

2021/06/01 14:32

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -466,6 +466,8 @@
466
466
 
467
467
 
468
468
 
469
+ 問題点その2・3 の解決策を探しています。
470
+
469
471
  wavのデータを解析していく。
470
472
 
471
473
  byteに変換して、byteを削除していく…?
@@ -524,7 +526,27 @@
524
526
 
525
527
 
526
528
 
527
-
529
+ 問題点その1 の解決策を探しています。
530
+
531
+ mp3の長さは、Audacityだと11.623秒。
532
+
533
+ wavだと11.677秒。
534
+
535
+ mp3を測定するプログラムだと11.677秒。
536
+
537
+ 頭の無音は0.051秒
538
+
539
+ 後ろの無音は…波形ソフトで測るしかない。
540
+
541
+
542
+
543
+ ここさえ求まれば…
544
+
545
+ 11.677秒から逆に11.623秒を求める事は出来るのか?
546
+
547
+
548
+
549
+ ですが、未だに取っ掛かりすらありません。
528
550
 
529
551
 
530
552
 

3

思考錯誤中の内容を更新

2021/06/01 09:39

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -460,6 +460,14 @@
460
460
 
461
461
  ### 試行錯誤中
462
462
 
463
+ 今私が試行錯誤している事を記載していきます。
464
+
465
+ 間違っていたり、それは違うよ、等ツッコミ下さい。
466
+
467
+
468
+
469
+ wavのデータを解析していく。
470
+
463
471
  byteに変換して、byteを削除していく…?
464
472
 
465
473
  wavファイルの構成は
@@ -496,6 +504,8 @@
496
504
 
497
505
 
498
506
 
507
+ 44100Hz、2ch、16ビットはそのままなので問題はないはず。
508
+
499
509
  との事で、内容までのbyteを飛ばして、無音分を計算し飛ばす。
500
510
 
501
511
  AudioStreamは、ヘッダー等は飛ばされるような記事みた気もするけれど。
@@ -504,11 +514,17 @@
504
514
 
505
515
 
506
516
 
517
+ 抽出について、この情報が合っている事前提で一応進めていく…
518
+
519
+ これが合ってないと、また調べる所からになります。
520
+
521
+
522
+
507
- byteについて調べてい
523
+ waveとbyteについて調べていきます
508
-
509
- +何故か更新したはずなのに更新されていないので
524
+
510
-
511
- もう一度更新。
525
+
526
+
527
+
512
528
 
513
529
 
514
530
 

2

思考錯誤中を追加

2021/06/01 09:34

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -458,6 +458,60 @@
458
458
 
459
459
 
460
460
 
461
+ ### 試行錯誤中
462
+
463
+ byteに変換して、byteを削除していく…?
464
+
465
+ wavファイルの構成は
466
+
467
+
468
+
469
+ 引用
470
+
471
+ 「wavファイルは、次のヘッダーから必ず始まります。
472
+
473
+ 文字列 RIFF (4byte)
474
+
475
+ これ以降チャンクのサイズ (4byte)
476
+
477
+ 文字列WAVE (4byte)
478
+
479
+
480
+
481
+ チャンク
482
+
483
+ チャンク名(4byte)
484
+
485
+ これ以降のチャンクのサイズ(4byte)
486
+
487
+ 内容」
488
+
489
+ となっている。
490
+
491
+
492
+
493
+ 「EDIT40秒部分の抽出について
494
+
495
+ デコーダの出力はpcmサンプルです。 入力が16ビットステレオ44100Hzの場合、各フレームは16ビット×2チャンネル= 4バイト、1秒は44100×4バイトです。目的の部分が始まるまで必要なだけ出力バイトをスキップし、次に44100 * 4 * 40バイトを40秒間ダンプします。モノラルにミキシングしてから8ビットにカットすることもできます。 」
496
+
497
+
498
+
499
+ との事で、内容までのbyteを飛ばして、無音分を計算し飛ばす。
500
+
501
+ AudioStreamは、ヘッダー等は飛ばされるような記事みた気もするけれど。
502
+
503
+ 0.051秒分飛ばして、そこからmp3の長さ-0.051秒間分ダンプ分ダンプする。
504
+
505
+
506
+
507
+ byteについて調べていく。
508
+
509
+ +何故か更新したはずなのに更新されていないので
510
+
511
+ もう一度更新。
512
+
513
+
514
+
461
515
  ### 補足
462
516
 
463
517
  プログラミングはJavaが初めてのJavaを初めて5ヵ月と31日です。

1

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

2021/06/01 09:25

投稿

pea-cap
pea-cap

スコア4

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,54 @@
16
16
 
17
17
 
18
18
 
19
+ mp3
20
+
21
+ Audacityでは、長さは11.623になっていた。
22
+
23
+ mp3 mediainfoというソフトにて
24
+
25
+ ながさ : 11秒 650秒
26
+
27
+ OBR モード : CBR モード
28
+
29
+ オーバルビットレート : 192 Kbps
30
+
31
+ 使用したライブラリ : LAME3.100
32
+
33
+
34
+
35
+ オーディオ
36
+
37
+ フォーマット : MPEG Audio
38
+
39
+ バージョン : Version 1
40
+
41
+ プロファイル : Layer 3
42
+
43
+ 設定 : Joint stereo / MS Stereo
44
+
45
+ ながさ : 11秒 651秒
46
+
47
+ ビットレートモード : CBR モード
48
+
49
+ ビットレート : 192 Kbps
50
+
51
+ チャンネル : 2 チャンネル
52
+
53
+ サンプルレート : 44.1 KHz
54
+
55
+ フレームレート : 38.281 fps (1152 SPF)
56
+
57
+ Compression mode : Lossy
58
+
59
+ ストリームサイズ : 273 KiB (100%)
60
+
61
+ 使用したライブラリ : LAME3.100
62
+
63
+ エンコードライブラリの設定 : -m j -V 4 -q 3 -lowpass 18.6 -b 192
64
+
65
+
66
+
19
67
  初めてJavaでゲーム制作をしています。(ドラクエ1レベル程度の内容)
20
68
 
21
69
  フリー音源を集めてBGMを鳴らそうと思ったのですが
@@ -156,7 +204,9 @@
156
204
 
157
205
  mp3をAudacityで測定すると曲は11.623秒と表示されます。
158
206
 
159
- しかし、music.info でmp3を見ると11秒650と表示されます。
207
+ しかし、Mediainfoというソフトでmp3を見ると11秒650と表示されます。
208
+
209
+
160
210
 
161
211
  Javaでmp3の曲の長さを調べるプログラムが記事に載っていたので試すと
162
212
 
@@ -170,13 +220,19 @@
170
220
 
171
221
  Long duration = (Long) properties.get("duration");
172
222
 
223
+
224
+
225
+ duration = 11677000になりました。
226
+
227
+ なりましたが…それはwavに変換した際のAudacityで調べた長さと一緒でした。
228
+
229
+ 変換前の値は11.623秒なので、mp3の長さが
230
+
173
- duration = 11651000 表示されま。11.651秒?
231
+ duration = 11623000となってほしいで
232
+
174
-
233
+ Javaでmp3の取り扱いが少なく、さらに曲の長さを求めるサンプルコードは
234
+
175
- 正確に11.623秒と求めたすが、Java sound api の標準のメソッド
235
+ これくらしかありませんした…(Java sound api のメソッドだと-1になる)
176
-
177
- 用いても-1と出ます。その為の上のプログラムなのですが思っていた値と違うようで…
178
-
179
- 他の方法を調べても、他にありませんでした…
180
236
 
181
237
 
182
238