Как сделать так, чтобы мое приложение на Java с аудио проигрывалось в Linux? - PullRequest
5 голосов
/ 21 декабря 2009

У меня есть приложение на Java, пользовательский интерфейс которого сильно зависит от звука. В Windows и OS X все работает нормально; однако в Linux приложению требуется эксклюзивный доступ к звуковому устройству, выбрасывается LineUnavailableException и звук не слышен. Я использую Kubuntu 9.10.

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

Вот код, который я использую для воспроизведения аудио:

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);

Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);

clip.start();

this.wait((clip.getMicrosecondLength() / 1000) + 100);

clip.stop();

Я что-то не так делаю? Является ли использование Java для воспроизведения звука в Linux безнадежным?

Ответы [ 5 ]

5 голосов
/ 21 декабря 2009

Боюсь, что звук в Linux сам по себе потерян. Но в данном случае это действительно известная ошибка Java . Вы должны попытаться выяснить, какую звуковую архитектуру вы используете. Я думаю, что по умолчанию для Ubuntu PulseAudio / ALSA . Я не уверен насчет Kubuntu.

Существует известный обходной путь (хотя я сам никогда не пробовал).

Также возможно, что некоторые другие приложения, которые вы запускаете, используют исключительно звуковую карту, поэтому не забудьте протестировать с другими приложениями (то есть приложениями, которые хорошо играют с другими).

2 голосов
/ 14 января 2011

Мне удалось воспроизвести звук в GNU / Linux (Ubuntu 10.10) с использованием OpenJDK с некоторыми изменениями. Я считаю, что LineUnavailableException была ошибкой в ​​PulseAudio и была исправлена ​​в 10.10.

Мне нужно было указать формат (что-то не нужно в Windows).

AudioInputStream audioIn = AudioSystem.getAudioInputStream(in);

// needed for working on GNU/Linux (openjdk) {
AudioFormat format = audioIn.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip)AudioSystem.getLine(info);
// }
// on windows, {
//Clip clip = AudioSystem.getClip();
// }

Помните, что вызов Clip.getMicrosecondLength () возвращает миллисекунды .

1 голос
/ 31 марта 2010

Java Sound ужасен для задач высокой точности или с малой задержкой и почти полностью не функционирует в Linux. Откажитесь от корабля сейчас, прежде чем погрузиться в него. После Java Sound я попробовал OpenAL, который тоже не был удачным для Linux. В настоящее время я использую FMOD, который, к сожалению, с закрытым исходным кодом.

Путь с открытым исходным кодом, вероятно, будет PortAudio. Попробуйте поговорить с разработчиками SIP Communicator.

Я также попробовал RtAudio, но обнаружил, что в его реализации ALSA есть ошибки.

0 голосов
/ 13 января 2014

Отправить команду mplayer через оболочку. Самое простое решение.

0 голосов
/ 01 ноября 2013

я получил этот код где-то в интернете, звук появляется чаще всего, иногда не приходит

import java.util.*;
import java.text.*;
import java.io.*;

import java.net.*;
import javax.sound.sampled.*;
public class Sound2
{
    public static
    void main (String name[])
    {
        playSound ( "somesound.wav" );
    }
    public static
    void playSound (String filename)
    {

        int BUFFER_SIZE = 128000;
         //File soundFile = null;
         AudioInputStream audioStream = null;
         AudioFormat audioFormat = null;
         SourceDataLine sourceLine = null;
        try 
        {
            audioStream = 
            AudioSystem.getAudioInputStream
            (
                new
                BufferedInputStream 
                (
                    new FileInputStream ( filename )
                )
            //soundFileStream
            );
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        audioFormat = audioStream.getFormat();

        DataLine.Info info = new DataLine.Info
        (
            SourceDataLine.class, 
            audioFormat
        );
        try 
        {
            sourceLine = (SourceDataLine) AudioSystem.getLine(info);
            sourceLine.open(audioFormat);
        } 
        catch (LineUnavailableException e) 
        {
            e.printStackTrace();
            System.exit(1);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
            System.exit(1);
        }

        sourceLine.start();

        int nBytesRead = 0;
        byte[] abData = new byte[BUFFER_SIZE];
        while (nBytesRead != -1) 
        {
            try 
            {
                nBytesRead = 
                audioStream.read(abData, 0, abData.length);
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
            if (nBytesRead >= 0) 
            {
                @SuppressWarnings("unused")
                int nBytesWritten = 
                sourceLine.write(abData, 0, nBytesRead);
            }
        }

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