Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 08.05.2017
Сообщений: 10

Воспроизведение звука в консольном приложении через javax.sound.sampled.*

31.08.2017, 21:32. Показов 2976. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для изучения java пишу для себя консольное приложение. Одной из функций хочу сделать фоновую музыку. С её воспроизведением разобрался, но мне необходимо, чтобы после окончания мелодии она начиналась снова, а это у меня не получается. Что не так?
ЗЫ: приложение пишу и тестирую с убунты

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
public class Sound {
 
    public File soundFile = null;
    AudioInputStream ais = null;
    double[] soundVolumes = new double[101];
    Clip clip = null;
    long clipLength = 0;
    FloatControl volume = null;
    boolean isPlaying = false;
    long timeOfBegin = 0;
    boolean musicMain = false;
 
    public static void main(String[] args)
            throws InterruptedException, UnsupportedAudioFileException,
            LineUnavailableException, IOException{
        Sound sound = new Sound();
        String path = null;
        try { // если запускаю через скрипт sh - прописываю путь к директории 
// (java Sound $PWD или java Sound %CD% - аналог на винде)
// но тестить проще через IntellijIdea, для этого путь прописывается вручную
            path = args[0] + "/music/Daemon.wav"; // сам берёт адрес директории где находится
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Запуск не из консоли!\n\n");
            path = "/home/exulw0lf/IdeaProjects/Sticks_r2/NewFolder/sourses/music/Daemon.wav";
        }catch (NullPointerException e) {
            System.out.println("Запуск не из консоли!\n\n");
            path = "/home/exulw0lf/IdeaProjects/Sticks_r2/NewFolder/sourses/music/Daemon.wav";
        }
        sound.start(path, true);
    }
 
    public void selectAudio(String s)
            throws IOException, UnsupportedAudioFileException,
            LineUnavailableException {
        soundFile = new File(s);
        // создаём объект файла
        ais = AudioSystem.getAudioInputStream(soundFile);
        // создаём звуковой поток
        clip = AudioSystem.getClip();
    }
 
    public void start(String s, boolean m)
            throws IOException, UnsupportedAudioFileException,
            LineUnavailableException, InterruptedException {
        musicMain = m;
        selectAudio(s);
        clip.open(ais); // открываем файл
        clipLength = clip.getMicrosecondLength()/1000000; // длинна песни в сек
        volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        // созд. объект упр-ия звуком
        while (musicMain) {
            playPrimary();
        }
        clip.close();
    }
 
    public void playPrimary() throws InterruptedException {
        if (!isPlaying) {
            clip.setFramePosition(0); // ставим музыку на начало
            clip.start(); // запускаю песню
            timeOfBegin = getCurrentTime();
            setVolume(50);
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                public void run() {
                    if ((timeOfBegin + 202000) == getCurrentTime()) {
                        System.out.println("End of song");
                        clip.stop();
                        System.out.println("So we'll start again");
                    }
                }
            }, 0, clipLength * 1000);
            timeOfBegin = getCurrentTime();
            //System.out.println(timeOfBegin);
        }
    }
 
    public long getCurrentTime() {
        Date time = new Date();
        return time.getTime();
    }
 
    public void volume() {
         // созд. массив, переводящий проценты в звук. шкалу для удобного контроля звука
        soundVolumes[0] = -80;
        for (int i = 1; i < 101; i++) {
            double zzz = (-60 + i * 0.660406);
            soundVolumes[i] = zzz;
        }
    }
 
    public void setVolume(int i) {
        volume.setValue((float) soundVolumes[i]);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2017, 21:32
Ответы с готовыми решениями:

Ошибка воспроизведения звука в консольном приложении
Почему не хочет воспроизводится звук(в консольном приложении)??? Этот же код в формах все нормально воспроизводит!!! Пробовал и с...

Воспроизведение звука в приложении с определенным интервалом времени
Можно ли сделать так, чтобы звуковой сигнал воспроизводился один раз вместе с открытием формы и далее с некоторой периодичностью до...

Андроид Студио ругается на импорт javax.sound.*
Столкнулся с проблемой: Андроид студио ругается на импорт import javax.sound.midi.MidiChannel import...

2
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
01.09.2017, 12:26
Class Sound
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
public class Sound {
 
    public File soundFile = null;
    AudioInputStream ais = null;
    double[] soundVolumes = new double[101];
    Clip clip = null;
    long clipLength = 0;
    FloatControl volume = null;
    boolean isPlaying = false;
    long timeOfBegin = 0;
    boolean musicMain = false;
 
    public static void main(String[] args)
            throws InterruptedException, UnsupportedAudioFileException,
            LineUnavailableException, IOException{
        Sound sound = new Sound();
        String path = null;
        try { // если запускаю через скрипт sh - прописываю путь к директории 
// (java Sound $PWD или java Sound %CD% - аналог на винде)
// но тестить проще через IntellijIdea, для этого путь прописывается вручную
            path = args[0] + "/music/Daemon.wav"; // сам берёт адрес директории где находится
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Запуск не из консоли!\n\n");
            path = "/home/exulw0lf/IdeaProjects/Sticks_r2/NewFolder/sourses/music/Daemon.wav";
            path = sound.getClass().getResource("source/daemon.wav").getPath();
        }catch (NullPointerException e) {
            System.out.println("Запуск не из консоли!\n\n");
            path = "/home/exulw0lf/IdeaProjects/Sticks_r2/NewFolder/sourses/music/Daemon.wav";
        }
        sound.start(path, true);
    }
 
    public void selectAudio(String s)
            throws IOException, UnsupportedAudioFileException,
            LineUnavailableException {
        soundFile = new File(s);
        // создаём объект файла
        ais = AudioSystem.getAudioInputStream(soundFile);
        // создаём звуковой поток
        clip = AudioSystem.getClip();
    }
 
    public void start(String s, boolean m)
            throws IOException, UnsupportedAudioFileException,
            LineUnavailableException, InterruptedException {
        musicMain = m;
        selectAudio(s);
        clip.open(ais); // открываем файл
        clipLength = clip.getMicrosecondLength()/1000; // длинна песни в milliseconds
        volume = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        // созд. объект упр-ия звуком
        playPrimary();          // запускает таймер и он крутится также бесконечно
        while (musicMain) {     // тут бесконечный цикл на самом деле
        }
        clip.close();            // сюда не доходит
    }
 
    public void playPrimary() throws InterruptedException {
        if (!isPlaying) {
            isPlaying = true;
            clip.setFramePosition(0); // ставим музыку на начало
            clip.start(); // запускаю песню
            timeOfBegin = getCurrentTime();
            setVolume(50);
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                private int counter = 0;
                public void run() {
                    System.out.println("Check time > "+counter++);
                    if (timeOfBegin + clipLength/4 < getCurrentTime()) {  // 1/4 клипа
                        System.out.println("End of song");
                        clip.stop();
                        System.out.println("So we'll start again");
                        timeOfBegin = getCurrentTime();
                        clip.setFramePosition(0); // ставим музыку на начало
                        clip.start(); // запускаю песню
                        counter = 0;
                    }
                }
            }, 0, 500);  // period sound+2sec
 
            //System.out.println(timeOfBegin);
        }
    }
 
    public long getCurrentTime() {
        Date time = new Date();
        return time.getTime();
    }
 
    public void volume() {
         // созд. массив, переводящий проценты в звук. шкалу для удобного контроля звука
        soundVolumes[0] = -80;
        for (int i = 1; i < 101; i++) {
            double zzz = (-60 + i * 0.660406);
            soundVolumes[i] = zzz;
        }
    }
 
    public void setVolume(int i) {
        volume.setValue((float) soundVolumes[i]);
    }
}

Смотрите код. Путь до клипа изменен, полный комплект файлов в архиве
по ссылке https://cloud.mail.ru/public/G3LY/oHnr6VH2G.
Если надо путь измените для себя.
Клип перезапускается бесконечно, крутится в цикле 1/4 длины клипа.
Чтобы выйти из программы нужны дополнительные условия, по таймеру, по клавиатуре.
Это не реализовано, программа просто крутится в цикле while в потоке main,
а клип перезапускается в отдельном потоке по таймеру.
1
0 / 0 / 1
Регистрация: 08.05.2017
Сообщений: 10
02.09.2017, 13:54  [ТС]
Спасибо большое! Этот код мне очень помог. Скажите, пожалуйста, что значит эта строка:
[JAVA]path = sound.getClass().getResource(path).getPath();[/JAVA]
Я не вполне понимаю как работает такой вызов методов и хотел бы узнать побольше

Добавлено через 7 минут
И ещё: можно ли запускать выполнение других команд (вывод текста и тд) вместе с музыкой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2017, 13:54
Помогаю со студенческими работами здесь

Как редактировать текст через консоль в Консольном приложении?
Передаю в консоль текст из переменной string.Хочу узнать как передвигаться с помощью стрелочек и в тоже время как его редактировать через...

Воспроизведение звука через колонки/наушники
У меня проблема с воспроизведением звука через колонки/наушники. Диспетчер аудио - Realtek HD Аудиосистема - 5.1 + наушники Проблема...

Воспроизведение звука через html5 audio
Создал сайт. Необходимо сделать так, чтобы воспроизводился звук через html5 audio 1 РАЗ. Перерыл кучу всего, но так и не нашел. При...

Воспроизведение звука одновременно через наушники и динамики ноутбука
Ноут HP G6 1216er, Windows 7 Home basic. Проблема появилась сегодня утром, ранее такой проблемы не встречалось. Удалял и заново ставил...

Воспроизведение звука wav через PlaySound С++ Builder 6.0 - исправить ошибки
Не могу воспроизвести звук wav через PlaySound С++ Builger 6.0 Постоянно какие то ошибки. Помогите


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru