java - 使用 libgdx 录制和播放音频

标签 java libgdx

我想知道是否有人有幸使用 libgdx 录制和播放音频。我目前正在使用 0.9.8 并且只是在尝试制作一个简单的语音聊天应用程序。

我使用

创建我的音频设备
int samples = 44100;
int seconds = 5;
boolean isMono = true;
short[] data = new short[samples*seconds];

AudioRecorder recorder = Gdx.audio.newAudioRecorder(samples, isMono);
AudioDevice player = Gdx.audio.newAudioDevice(samples, isMono);

在按下按钮时,我启动了一个新线程来记录数据。 (我知道开始一个新线程很麻烦,但我只是想玩录音)

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Record: Start");
        recorder.read(data, 0, data.length);
        System.out.println("Record: End");
    }
}).start();

录制完成后我使用

回放录制的数据
new Thread(new Runnable() {
@Override
public void run() {
    System.out.println("Play : Start");
    player.writeSamples(data, samples, data.length);
    System.out.println("Play : End");
}
}).start();

在我的笔记本电脑上,录音和回放似乎工作正常。我可以记录数据,然后播放效果很好。 问题发生在安卓上。我已经在三台设备(Samsung S3、Samsung Galaxy Mini 和 Nexus 10)上试过了。在所有情况下,录音都完美无缺,当我尝试播放时会出现问题,它只是锁定在 player.writeSamples 中并且没有播放任何内容。我离开它 10 分钟,从不打印“记录:结束”。

有人用过音频播放吗?我错过了什么吗?

最佳答案

经过一番尝试,我发现了问题。

你的线路,在这里:

player.writeSamples(data, samples, data.length);

应该改为:

player.writeSamples(data, 0, data.length);

第二个参数是偏移量,不是采样率。

因此,总而言之,以下内容适用于 Android 设备:

final int samples = 44100;
boolean isMono = true;
final short[] data = new short[samples * 5];

final AudioRecorder recorder = Gdx.audio.newAudioRecorder(samples, isMono);
final AudioDevice player = Gdx.audio.newAudioDevice(samples, isMono);

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Record: Start");
        recorder.read(data, 0, data.length);
        recorder.dispose();
        System.out.println("Record: End");
        System.out.println("Play : Start");
        player.writeSamples(data, 0, data.length);
        System.out.println("Play : End");
        player.dispose();
    }
}).start();

关于java - 使用 libgdx 录制和播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19015680/

相关文章:

java - 用笑脸围绕一根绳子

android - SetTexture 和 Sprites 没有按预期工作! (LibGDX)

java - 为什么直接从接口(interface)调用接口(interface)方法(没有实现)可以工作?

java - 覆盖绘图顺序 scene2D 的舞台

java - 主题、背景颜色和操作栏的交互

java - 在嵌入式 tomcat 中以 ROOT 身​​份部署

java - 请告诉我如何在执行 REST url(JERSEY) 后保持 POJO 类的顺序

gradle - libgdx一段时间后无法加载纹理

java - LibGDX 如何将游戏放入表格中? *** 固定的 ***

java - 如何在java中使用多个服务器以相同的顺序处理队列中的消息