gpt4 book ai didi

android - Libgdx,改变音乐中的音高

转载 作者:太空狗 更新时间:2023-10-29 15:46:05 26 4
gpt4 key购买 nike

我想实现一个很酷的效果,当发生爆炸时,音乐会稍微慢一点。

libgdx 的 Music 类不允许改变声音的音高,我尝试使用 Sound 类而不是 Music可以播放我的音乐,但加载文件的速度非常慢(在桌面上,5 MB 的文件需要 5 秒!)。

因此,问题是是否有解决此问题的方法,或者是否有外部库可以同时在桌面和 android 上工作,并且可以与 libgdx 一起工作。

最佳答案

经过一些搜索,我通过编辑 libgdx 源代码找到了一种方法。

您需要使用 AudioDevice 对象逐个播放您的音乐,为此您需要包含 libgdx 的音频扩展。

我们将编辑 libgdx 源代码,因此您需要下载它并将 gdx.jar 、 gdx-backend-android.jar 和 gdx-backend-lwjgl.jar 替换为正确的 libgdx 项目(它们具有相同的名称,但没有jar 扩展)

1)编辑gdx工程com.badlogic.gdx.audio包内的AudioDevice.java

在界面中添加如下代码

public void setSpeed(float val);

2)编辑gdx-backend-android项目com.badlogic.gdx.backends.android包内的AndroidAudioDevice.java

Android 端的AudioDevice 类依赖于Android sdk 的AudioTrack 类,这个类有一个setPlaybackRate(..) 方法。

在类中添加如下代码

@Override
public void setSpeed (float speed) {
track.setPlaybackRate((int)(track.getSampleRate()*speed));
}

3)编辑gdx-backend-lwjgl项目的com.badlogic.gdx.backends.lwjgl.audio包内的OpenALAudioDevice.java

AudioDevice 的桌面端依赖于 OpenAL(音频的 opengl),它有一个方便的设置音调方法

在类中添加以下内容

@Override
public void setSpeed (float speed) {
alSourcef(sourceID, AL_PITCH, speed);
}

4)播放音频

下面是加载和播放声音文件的代码

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.audio.io.Mpg123Decoder;
import com.badlogic.gdx.files.FileHandle;

public class MusicBeat {

static short[] samples = new short[2048];
Mpg123Decoder decoder;
AudioDevice device;
static FileHandle externalFile;
public boolean playing=true;
public MusicBeat(String name )
{
FileHandle file=Gdx.files.internal(name);
FileHandle external=Gdx.files.external("myappname/"+name);
if(!external.exists())file.copyTo(external); //copy the file to the external storage only if it doesnt exists yet
decoder = new Mpg123Decoder(external);
device = Gdx.audio.newAudioDevice(decoder.getRate(),decoder.getChannels() == 1 ? true : false);
playing=false;
externalFile=file;
}

void play()
{
playing=true;
Thread playbackThread = new Thread(new Runnable() {
@Override
public synchronized void run() {
int readSamples = 0;
while ( playing) {
if(decoder!=null){
if((readSamples = decoder.readSamples(samples, 0,samples.length))<=0){
decoder.dispose();
decoder = new Mpg123Decoder(externalFile);
playing=false;
}
device.writeSamples(samples, 0, readSamples);
}
}
}
});
playbackThread.setDaemon(true);
playbackThread.start();
}

public void stop(){
playing=false;
decoder.dispose();
}
public void setVolume(float vol){
device.setVolume(vol);
}
public void setSpeed(float speed){
device.setSpeed(speed);
}

从哪里获取音频扩展?(AudioDevice 需要)

音频扩展似乎已被弃用,而且不容易找到 jar ,我已经上传了 here ,它是一个旧版本,但应该可以正常工作。

更简单的方法?

如果你的游戏只是为了在桌面上运行,桌面上libgdx的音乐类再次依赖于OpenAL,它提供了播放音高的能力,所以你只需要编辑音乐界面(桌面上的OpenALMusic)而不是 AudioDevice 并逐个样本地从等式中取出整个播放样本,不幸的是,正如达维兹所说,android 上的音乐类依赖于 MediaPlayer,它没有给我们音高变化选项。

结论:这个方法对我来说似乎不太好,如果你的游戏真的需要 pitch 的东西并且没有它就没有意义那么就用它,否则它太费力了一个小细节。

关于android - Libgdx,改变音乐中的音高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com