首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ubuntu上用Java定义AudioFormat

在Ubuntu上用Java定义AudioFormat
EN

Stack Overflow用户
提问于 2015-01-05 18:30:56
回答 1查看 192关注 0票数 0

我想知道如何定义Ubuntu上剪辑的AudioFormat。在Windows上,下面的代码工作,但在Ubuntu14.10上,它不工作。

代码语言:javascript
复制
import java.io.ByteArrayInputStream;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

class SongPlayer{    
    static int samplesPerSecond = 44100;

    // Plays back a raw audio buffer being passed.
    // @param song Raw signal of sound to be played. Amplitude in range [-1.0, 1.0]
    static void playSong(double[] song){
        AudioFormat format = new AudioFormat(
            Encoding.PCM_SIGNED,         // Encoding
            samplesPerSecond,            // sample rate
            Short.SIZE,                  // bits per sample
            1,                           // number of channels
            Short.SIZE / 8,              // bytes per frame
            samplesPerSecond,            // frame rate
            true);                       // big endian

        ByteBuffer buffer = ByteBuffer.allocate(song.length * (Short.SIZE / 8));
        ShortBuffer sb = buffer.asShortBuffer();
        for (double value : song){
            value = Math.max(-1.0,  Math.min(1.0, value));
            sb.put((short)(Short.MAX_VALUE * value));
        }

        AudioInputStream stream = new AudioInputStream(new ByteArrayInputStream(buffer.array()), format, song.length);

        try{
            Clip clip = AudioSystem.getClip();
            clip.open(stream);
            clip.start();
            Thread.sleep(1000 * 5);
            clip.drain();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("Playback failed!");
        }
    }

    public static void main(String[] args){
        double[] noise = new double[1000000];

        for(int i = 0; i < 1000000; i++){
            noise[i] = 2 * Math.random() - 1;
        }

        playSong(noise);
    }
}

错误消息如下:

代码语言:javascript
复制
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.createStream(PulseAudioDataLine.java:142)
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:99)
    at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:283)
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
    at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
    at SongPlayer.playSong(song.java:39)
    at SongPlayer.main(song.java:56)
Playback failed!

通常,我会使用stream.getFormat()来获得格式,但是在这种情况下,我希望在-1和1之间“播放一首随机数的歌曲”,这会导致随机噪声。我读过与类似问题有关的问题,但他们通常只是想要一个文件,而这是另一回事。感谢任何提供帮助的人!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 19:32:15

不要将IcedTea JRE用于您的程序。我使用webupd8 ppa中的Oracle 8在ubuntu上运行了您提供的代码;它可以工作。安装Oracle Java 8,类似于

代码语言:javascript
复制
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27785656

复制
相关文章

相似问题

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