【问题标题】:Getting different bytes from the same audio file从同一个音频文件中获取不同的字节
【发布时间】:2016-12-20 13:50:17
【问题描述】:

我正在尝试将音频文件转换为标准格式并读取字节。

我要做的第一件事是:

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

操作系统。 Ubuntu 14.04

java 版本“1.8.0_111” Java(TM) SE 运行时环境 (build 1.8.0_111-b14) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.111-b14,混合模式)

【问题讨论】:

  • 我没有使用过这个 API,但看起来你正试图将 MP3 读取为 PCM,但这是行不通的。您需要使用 MP3 编解码器将 MP3 解码为 PCM,然后才能对其进行任何其他操作。
  • 你已经添加了所有这些库,但是你在哪里使用它们。 mp3 需要专门阅读 audioinputstream 不支持它,这就是为什么您添加库以开头不是吗?去看看其他一些使用这些库来阅读 mp3 的例子,否则我稍后会回来

标签: java audio-streaming


【解决方案1】:

核心是:保证调用 read 将始终从您的输入中读取完全相同数量的字节。

相反,read 方法将读取的字节数返回给您。所以你总是需要一个循环,它会一直读取直到真正读取所有个预期的字节!

编辑:鉴于您的 cmets:您正在这里进行音频转换;所以我的猜测是:这个过程根本不是确定性的。换句话说:该 MP3 文件的实际输入字节总是相同的;但是您的代码对此进行了转换;如前所述;这些转换是不确定的;因此每次运行都会产生略有不同的结果。

【讨论】:

  • 我的意思是,前 10 个字节总是不同的。编辑了原始帖子。
  • 我不确定我是否理解。我希望前 10 个字节应该始终相同。没有?
  • 转换怎么可能是一个不确定的过程?
  • 因为启发式的潜在用途?通过并行做事;并且可能只是为了获得第一批结果?
  • 那么没有办法得到同样的结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多