首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioInputStream:在macOS和8位wav文件上使用Java1.7和1.8的Pop噪声

AudioInputStream:在macOS和8位wav文件上使用Java1.7和1.8的Pop噪声
EN

Stack Overflow用户
提问于 2016-12-30 16:48:50
回答 1查看 239关注 0票数 1

我在使用AudioInputStream播放示例时遇到了一个奇怪的问题。三种情况:

  • macOS,java1.6:工作完美
  • win,java 1.8:工作完美
  • macOS,java 1.8:沉重的流行音乐

我为测试创建的代码是直接的。样品是干净的(开始和结束时零交叉)。第一个pop已经发生在soundLine.start()上,它完全独立于示例。最后一次pop发生在soundLine.close()上,该示例在几秒钟后就完成了。我在代码中添加了一些延迟,因此很容易识别代码的位置。

我制作了演示视频,在那里你可以听到发生了什么:

  • 在macOS塞拉利昂(在MBP和iMac上进行测试)。第一次使用Java-8运行,第二次使用Java-6运行。您可以在屏幕上看到使用过的java版本):33ME
  • on win (win7并行运行):https://youtu.be/PGd4iW3oO4Y

如您所见(听说),唯一的问题是macOS下的Java1.8。我还用相同的结果测试了java1.7。只有1.6的回放是正确的。流行音乐的声音听起来很奇怪,因为这个声音是用我的MBP的内部微音波记录下来的。这是一个典型的流行声音,你可以听到开关电源时,一个糟糕的设计放大器。

增编:问题似乎只发生在8位wav文件上.16位工作正常。

增编:同时被列为bug: http://bugs.java.com/bugdatabase/view

有人能重现这个问题吗?知道原因是什么吗?我目前假设Java中有一个bug。

代码语言:javascript
复制
import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class Soundtest
{
    protected File sample=new File("user1.wav");

    public Soundtest()
    {                   
        SourceDataLine soundLine = null;
        int BUFFER_SIZE = 1024; 

        System.out.println("AudioInputStream test with "+System.getProperty("java.version")+" on "+System.getProperty("os.name"));
        // Set up an audio input stream piped from the sound file.
        try 
        {       

            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(sample);
            AudioFormat audioFormat = audioInputStream.getFormat();
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);

            //Soundline ist noch nicht angelegt -> angelegen.
            if(soundLine==null)
            {
                soundLine = (SourceDataLine) AudioSystem.getLine(info);
                soundLine.open(audioFormat);
                soundLine.start();
            }
            System.out.println("Started");
            Thread.sleep(2000);

            System.out.println("Playing");
            int nBytesRead = 0;
            byte[] sampledData = new byte[BUFFER_SIZE];
            while (nBytesRead != -1) 
            {
                nBytesRead = audioInputStream.read(sampledData, 0, sampledData.length);
                if (nBytesRead >= 0) 
                {                           
                    soundLine.write(sampledData, 0, nBytesRead);                        
                }                               
            }           
            Thread.sleep(2000);
            System.out.println("Draining");
            soundLine.drain();

            Thread.sleep(2000);
            System.out.println("Closing");
            soundLine.close();
        }           
        catch (Exception e) 
        {
           e.printStackTrace();
        } 

    }

    public static void main(String[] args) 
    {          
        new Soundtest();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-12-30 17:08:39

我看不出你的代码有什么问题。我自己用Java 1.8.0_60在macOS塞拉利昂10.12.2上运行过,我的耳机里没有弹出的声音,当我从内部扬声器出来时也没有弹出。我现在能想到的唯一原因是,由于某种原因,Java 1.8不喜欢您正在使用的音频接口或媒体,如果它与Mac上的通用扬声器有任何不同的话。甚至在1.8中,音频缓冲的方式也可能有所不同。尝试提高缓冲区大小以防止未运行(这可能是弹出的原因)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41399694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档