Java Звук не воспроизводится - PullRequest
2 голосов
/ 09 июля 2020

Я знаю, что эта проблема уже запрашивалась ранее, и я просмотрел ответы и попытался их реализовать, но пока никакие решения, похоже, не работают для меня. Кто-нибудь может взглянуть на мой код и помочь мне понять, почему программа завершается мгновенно, а звук не воспроизводится ....? заранее спасибо

import javax.sound.sampled.*;
import java.io.*;
import java.net.URL;

public class SoundPlayer {

    public SoundPlayer() {
    }

    public static void play(String file) {
        File sound = new File(file);
        try {
            String url = sound.toURI().toURL().toString();
            System.out.println(url);
            Clip clip = AudioSystem.getClip();
            clip.open(AudioSystem.getAudioInputStream(new URL(url)));
            clip.start();
            clip.loop(Clip.LOOP_CONTINUOUSLY);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SoundPlayer player = new SoundPlayer();
        player.play("sounds/1.wav");

    }
}

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Хорошо, поэтому ответ должен включать Thread.sleep (1000000);

Если кто-нибудь знает, почему это так, и хочет просветить меня, я был бы рад услышать от вас - помогите мне с моим обучением :)

0 голосов
/ 09 июля 2020

Ваша программа является примером многопоточного кодирования. Команда clip.start() запускает новый, одновременно работающий поток, а затем без паузы переходит к следующей строке кода. Затем ваш поток устанавливает флаг l oop и завершает работу.

Между тем, параллельный поток "play" выполняется. Но эта ветка получила статус «демон». Обычные потоки будут поддерживать выполнение программы до тех пор, пока они не будут завершены, но потоки статуса «демона» позволят себе останавливаться, если нет обычных живых потоков. Итак, когда «основной» поток завершен, поток воспроизведения звука также завершается.

Информация API о потоках .

Когда Clip запускает новый поток с помощью метода start(), потоку автоматически присваивается статус daemon.

Однако меня сбивает с толку то, что я не могу найти любую документацию API о состоянии нового потока запущен Clip. Об этом также нет упоминания в учебнике Oracle Воспроизведение аудио . Так что вас и бесчисленное множество других людей, впервые использующих объект Clip, вряд ли можно обвинить в том, что вы были озадачены, когда это происходит.

0 голосов
/ 09 июля 2020

Когда вы выполняете файл (звуковой файл .wav в вашем случае), он активен до тех пор, пока ваш код уже запущен, поэтому, когда выполнение завершено, он останавливается в вашем случае, единственный код, который нужно выполнить, - это воспроизвести .wav файл, а затем выполнение завершается, звук воспроизводится, но останавливается так быстро.

Решение, как вы предложили Thread.sleep(time), заключается в том, чтобы сохранить выполнение в течение выбранного времени, а затем оно останавливается, а звуковой файл с Это. Вы можете использовать while l oop, чтобы удерживать выполнение, пока есть код для выполнения, и это означает, что аудиофайл будет играть вместе с ним (вы использовали clip.loop(Clip.LOOP_CONTINUOUSLY);)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...