- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想实现一个很酷的效果,当发生爆炸时,音乐会稍微慢一点。
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/
启动Android游戏时,我试图让一些音乐淡出。音乐在主菜单中播放,然后在播放器单击播放时淡出。我可以停止播放音乐,只是不会消失。 我试图用这个淡出: using UnityEngine; using
我正在 XNA 中创建一个游戏,它可以使用大量的音乐循环,但我似乎无法同步这些声音。 我总是错过几毫秒你能帮我吗? 这是我第一次尝试同步声音。请注意,我需要处理数十种声音...... 这个同步问题可能
我使用以下代码播放了一首歌,但它有 11 分钟长,我该如何停止它? 此代码位于 jFrame 1 中。如何使其停止在 jFrame 2 中? Input
在阅读我的书并浏览一些 YouTube 教程后,我对标准化的理解是,重要的事情之一就是不要有重复的值。更具体地说,主键 (ID) 不应重复。 因此,如果我正在使用音乐/音乐会数据库中的某些表,那么以下
我正在用 java 创建一个应用程序/游戏,其中包含背景音乐/声音。一切都按预期工作。如果播放某些系统声音/媒体声音/其他声音,我想静音/停止。 有什么建议...?? 最佳答案 我建议不要关心这个问题
只是尝试从图像 (1080p .png) + 音乐 (320Kb mp3) 为 youtube 制作视频。 ffmpeg -loop 1 -i image.png -i music.mp3 -
我正在GW-Basic中开发游戏,我想向其中添加音乐,但问题是我无法在后台播放,但是当我添加声音时先播放声音,然后在开始执行游戏和vICE之后vERSA。而我希望这两件事同时播放..所以知道怎么做吗?
我正在使用Xcode的Sprite套件开发iPhone游戏,想知道是否有一种简单或最佳实践的方法可以通过编程方式消除所有声音效果/音乐?对我来说,最明显的方法是创建一些 bool(boolean) 变
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我正在设计一个 Android 应用程序,需要依次播放各种短音乐文件。 我设置了一个“onClick”监听器来运行一个循环,一遍又一遍地播放这些声音文件,它们可能会播放 100 多次。 但是 我需要用
我有一个网站,其中包含集成到布局中的 Flash 音乐播放器。我希望用户能够在不中断音乐的情况下浏览网站。我做了很多研究和思考,以下是我提出的选项(请记住,我希望尽可能对 SEO 友好)。有人有其他想
我可以即时生成一些音调并播放声音吗?例如,如果我想生成 DO RI MI FA SO LA XI 音调并播放它们? 似乎声音 API 都是为了播放现有的音频文件。谢谢! 最佳答案 参见 Matt Ga
我一直在尝试将音乐添加到我的应用程序中,但没有特别成功。我一直在尝试使用 AVFoundation,我的代码如下: //MUSIC var audioPlayer = AVAudioP
MPMediaPickerController 返回一个 MPMediaItem 如果返回本地 url,则可以播放声音。 如果音乐没有下载到本地,则assetURL为空。 如何在本地下载 MPMedi
有什么方法可以检测是否正在播放 iPod 应用以外的其他来源的音乐或媒体? 我知道我可以检测到从 ipod 播放的音乐: [[MPMusicPlayerController iPodMusicPlay
我刚刚安装了 music21,我正在尝试开始使用它。我安装了 Musescore3,但我无法使 show() 函数工作。 我试过按照我在网上找到的一些说明更改路径,但无济于事 from music21
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我目前正在寻找某种方式来扩展SFML.Net以使用MP3。因此,ioctllr推荐了NLayer,我想尝试一下。这是我的方法: namespace AudioCuesheetEditor.AudioB
我包含了正确的库和所有内容,这部分代码由于某种原因给出了段错误: int numerator = atoi(&fraction[0]); int denominator = atoi(&fracti
是否可以播放 AVPLayer 实例(带有视频)并同时使用 MPMusicPlayerController 实例来播放 iTunes 播放列表? 我尝试了几种解决方案,但每次播放视频时音频都会停止,每
我是一名优秀的程序员,十分优秀!