我有一个用 ADPCM(id=2)、单声道、每个样本 4 位和一个“事实”块编码的 WAV 文件。许多没有出现在“正常”wav 中的东西。
AudioInputStream 的 AudioFileReader 类在解析格式代码时已经失败(这里是 2 == ADPCM),它只接受 1,3,6 和 7。
还有其他方法可以播放此类文件吗?由于标准 Java 显然无法做到这一点。
我有一个用 ADPCM(id=2)、单声道、每个样本 4 位和一个“事实”块编码的 WAV 文件。许多没有出现在“正常”wav 中的东西。
AudioInputStream 的 AudioFileReader 类在解析格式代码时已经失败(这里是 2 == ADPCM),它只接受 1,3,6 和 7。
还有其他方法可以播放此类文件吗?由于标准 Java 显然无法做到这一点。
对于 Windows(32/64) 和 macOS(64),您可以使用FFSampledSP、v0.9.29 或更高版本。您可以通过以下 Maven 依赖项获取它:
<dependency>
<groupId>com.tagtraum</groupId>
<artifactId>ffsampledsp-complete</artifactId>
<version>0.9.29</version>
</dependency>
或通过此下载链接。
一旦.jar
在类路径中,以下代码应该可以工作:
import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;
public class PlayADPCM {
public static void main(final String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException {
final File file = new File("your_adpcm_file.wav");
final AudioInputStream stream = AudioSystem.getAudioInputStream(file);
final AudioFormat format = stream.getFormat();
System.out.println("Source format: " + format);
final AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(), 16, format.getChannels(),
format.getChannels()*2,
format.getSampleRate(), format.isBigEndian());
System.out.println("Target format: " + targetFormat);
// convert source to target format
final AudioInputStream playableStream = AudioSystem.getAudioInputStream(targetFormat, stream);
// get a line and play it.
final DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class, targetFormat);
final SourceDataLine line = (SourceDataLine)AudioSystem.getLine(lineInfo);
line.open(targetFormat);
line.start();
final byte[] buf = new byte[1024*8];
int justRead;
while ((justRead = playableStream.read(buf))>0) {
line.write(buf, 0, justRead);
}
playableStream.close();
line.drain();
line.close();
}
}