我试图在树莓派的Processing3中获取并发(本例中为四个)音频文件来播放时遇到很多麻烦。音频最终变得非常断断续续,每隔半秒左右就会持续发出口吃,直到我决定将其关闭。

我还尝试了一个音频文件的播放,只是为了检查它,它开始断断续续地播放了好几秒钟,然后才变得有点断断续续(通常每5秒钟左右会发出断断续续的声音)。

我的第一个尝试是使用Minim库,但是我也尝试了Beads库(这在pi上完全失败,直到显示“内存不足错误”都冻结了)。我也尝试过Processing的声音库,但是无法在我的开发机上首次使用它(Windows 7和Java 1.8崩溃),并且ARM似乎不支持它。

我尝试播放的文件是当前的mp3文件,尽管我对此有控制权,并尝试了wav以及具有几个不同比特率(48、96、128、192 kbps)的mp3。无论我尝试哪种文件类型,我都听不到任何差异。

我正在使用的RPI是B +,最初运行时很忙,但是现在我迁移到了jessie-lite的新镜像(手动安装了运行Processing3所需的组件,包括Java 1.8)。内存分配分配为50%(从256mb到gpu)。

现在,使用Minim发出有关我的演奏方式的代码:

import ddf.minim.*;

private final String TYPE = ".mp3";
private final String MUSIC_A = "01-09_mixdown";
private final String MUSIC_B = "10-18_mixdown";
private final String MUSIC_C = "19-27_mixdown";
private final String MUSIC_D = "28-35_mixdown";
private final String SOUND_LOCATION = "sounds/";

Minim minim;
AudioPlayer[] audioPlayers= new AudioPlayer[4];

// have played with this a few times, trying 512, 1024, and 2048 as well as leaving this out altogether (default was 2048 I think)
int BUFFER_SIZE = 4096;

float changeRate = 0.05;
float[] volumes;

void setup(){
    this.frameRate = 24;
    size(320, 240, P2D);

    minim = new Minim(this);
    audioPlayers[0] = minim.loadFile(SOUND_LOCATION + MUSIC_A + TYPE, BUFFER_SIZE);
    audioPlayers[1] = minim.loadFile(SOUND_LOCATION + MUSIC_B + TYPE, BUFFER_SIZE);
    audioPlayers[2] = minim.loadFile(SOUND_LOCATION + MUSIC_C + TYPE, BUFFER_SIZE);
    audioPlayers[3] = minim.loadFile(SOUND_LOCATION + MUSIC_D + TYPE, BUFFER_SIZE);

    volumes = new float[4];
    volumes[0] = 0.5;
    volumes[1] = 0.5;
    volumes[2] = 0.5;
    volumes[3] = 0.5;

    audioPlayers[0].loop();
    audioPlayers[1].loop();
    audioPlayers[2].loop();
    audioPlayers[3].loop();

    println("Playing now");
}

void draw(){
    // no drawing for this test
}

最后,尝试在处理之外播放音频是成功的(使用omxplayer没有问题)。

想知道接下来我还能尝试什么,有什么想法吗?

最佳答案

我终于想出了在给定的库和环境下如何正确播放某种音频的方法:

我的猜测是mp3解码器的处理非常密集。我可能是错的,但是一个文件与四个mp3文件之间的差异使我得出了这个结论(即使两个结果都是断断续续/口吃)。

相反,我有wav文件可以工作。

他们以前没有工作过,因为事实证明我以32位浮点深度导出它们,我猜这与minim不兼容。 16位深度似乎可以正常工作,并且同时播放多个文件似乎没有什么大问题。

关于java - 在RPI上使用Minim产生断断续续/口吃的音频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43671600/

10-11 17:12