我正在尝试将音频文件转换为标准格式并读取字节。
我做的第一件事是:
static void main(String [] args)
{
File file = new File("/path/to/my/file.mp3");
AudioInputStream source = AudioSystem.getAudioInputStream(file);
AudioFormat sourceFormat = source.getFormat();
AudioFormat convertFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
sourceFormat.getSampleRate(),
16,
sourceFormat.getChannels(),
sourceFormat.getChannels() * 2,
sourceFormat.getSampleRate(),
false);
AudioInputStream convert1AIS = AudioSystem.getAudioInputStream(convertFormat, source);
AudioFormat targetFormat = new AudioFormat(
44100,
8,
1,
true,
true);
AudioInputStream target = AudioSystem.getAudioInputStream(targetFormat, convert1AIS);
byte[] buffer = new byte[4096];
//Here come strange things
target.read(buffer,0, buffer.length);
}
每次启动程序时,缓冲区都包含不同的字节,即前10个字节,我在调试器中看到的字节永远不会相同。怎么了?
我添加了以下库: jl1.0.1.jar, jtransform-2.4.jar, mp3spi1.9.5.jar, tritonus_remaining-0.3.6.jar, tritonus_share.jar
OS。 Ubuntu 14.04
java版“1.8.0_111” Java(TM)SE运行时环境(版本1.8.0_111-b14) Java HotSpot(TM)64位服务器VM(版本25.111-b14,混合模式)
答案 0 :(得分:0)
核心问题是: 保证对 read 的调用始终会从输入中读取完全相同的字节数。
相反,read方法返回读回给您的字节数。所以你总是需要一个循环来继续阅读,直到所有预期的字节真正被读取为止!
编辑:给出您的意见:您正在此处进行音频转化;所以我的猜测是:这个过程根本不是确定性的。换句话说:该MP3文件的实际输入字节将始终相同;但是你的代码会对其进行转换;如上所述;那些转变是非确定性的;因此每次运行都会产生略微不同的结果。