Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SourceDataLine格式支持的问题_Java_Javasound_Tarsosdsp - Fatal编程技术网

Java SourceDataLine格式支持的问题

Java SourceDataLine格式支持的问题,java,javasound,tarsosdsp,Java,Javasound,Tarsosdsp,我有一个用Java编写的应用程序,需要在其中播放音频。我使用OpenAL(带有javaopenal库)完成任务,但是我想使用WSOLA,这是OpenAL不直接支持的。我发现了一个很好的java本机库,名为TarsosDSP,它支持WSOLA 该库使用标准JavaAPI进行音频输出。问题发生在SourceDataLine设置过程中: IllegalArgumentException: No line matching interface SourceDataLine supporting form

我有一个用Java编写的应用程序,需要在其中播放音频。我使用OpenAL(带有javaopenal库)完成任务,但是我想使用WSOLA,这是OpenAL不直接支持的。我发现了一个很好的java本机库,名为TarsosDSP,它支持WSOLA

该库使用标准JavaAPI进行音频输出。问题发生在SourceDataLine设置过程中:

IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_UNSIGNED 16000.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian is supported.
我确保问题不是由于缺乏权限(在Linux上以root用户身份运行,并在Windows 10上进行了尝试)造成的,并且项目中没有使用其他SourceDataLines

在对格式进行修补之后,我发现当格式从PCM_UNSIGNED更改为PCM_SIGNED时,可以接受该格式。这似乎是个小问题,因为只将字节范围从unsigned移动到signed应该很容易。但奇怪的是,它没有本地支持

那么,有没有什么解决方案可以让我不必修改源数据


谢谢,Jan

您不必手动移动字节范围。创建AudioInputStream后,您将创建另一个AudioInputStream,该AudioInputStream采用有符号格式,并连接到第一个无符号流。如果随后使用签名流读取数据,声音API会自动转换格式。这样,您就不需要修改源数据

File fileWithUnsignedFormat;

AudioInputStream sourceInputStream;
AudioInputStream targetInputStream;

AudioFormat sourceFormat;
AudioFormat targetFormat;

SourceDataLine sourceDataLine;

sourceInputStream = AudioSystem.getAudioInputStream(fileWithUnsignedFormat);
sourceFormat = sourceInputStream.getFormat();

targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
    sourceFormat.getSampleRate(), 
    sourceFormat.getSampleSizeInBits(), 
    sourceFormat.getChannels(), 
    sourceFormat.getFrameSize(), 
    sourceFormat.getFrameRate(), 
    false);

targetInputStream = AudioSystem.getAudioInputStream(targetFormat, sourceInputStream);

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, targetFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);

sourceDataLine.open(targetFormat);
sourceLine.start();


// schematic
targetInputStream.read(byteArray, 0, byteArray.length);
sourceDataLine.write(byteArray, 0, byteArray.length);