我正在尝试开发一个 Android 应用程序,它使用一些声音并将它们混合在一起来创建音乐作品。一开始,我尝试同时再现声音,但是当我这样做时,它们变得不同步,在阅读论坛几个小时后,我意识到在循环模式下同时再现多个声音的最佳方法就是将音频文件合并为一个,然后将它们再现为一个文件。
这是我正在使用的代码:
//Oppening file 1
InputStream is = getAssets().open("sounds/sound_1.ogg");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
//End Oppening file 1
//Oppening file 2
InputStream is_2 = getAssets().open("sounds/sound_2.ogg");
int size_2 = is_2.available();
byte[] buffer_2 = new byte[size_2];
is_2.read(buffer_2);
is_2.close();
//End Oppening file 2
//Get Bigger size and Merge Files
int total_size =0;
byte[] buffer_final;
if(buffer.length>buffer_2.length){
total_size = buffer_2.length;
}else{
total_size = buffer.length-1;
}
buffer_final= new byte[total_size];
for(int i=30; i<total_size-30;i++){
float a =buffer[i];
float b =buffer_2[i];
float c = (a+b)/2;
buffer_final[i]=(byte) c;
}
FileOutputStream fos = new FileOutputStream(f);
fos.write(buffer_final);
fos.close();
之后,我使用 soundPool 读取生成的文件并尝试重现它。
如果我使用这个公式而不合并文件(因此,仅使用一种声音,创建一个新文件,然后读取它,它会完美地工作,所以我认为问题出在文件合并中,这可能并不像只需将字节相加然后除以 2。
执行此操作后,日志告诉我:
无法加载示例(空)。
并且 ofc,当我尝试重现日志时,显示样本尚未准备好。
请问对此有什么帮助吗?我已经用谷歌搜索了好几个星期了,但无法解决它......
这是我第一次编写 Android 程序,也是第一次编写音频程序,所以我有点迷失。
问题是,我该如何混合这些声音?我的做法正确吗?哪里有问题?
感谢您的阅读和帮助:)
如果您使用原始 PCM 数据,对样本进行平均就可以很好地工作。您需要做的就是首先将 OGG 文件转换为 PCM 缓冲区。如果您想将输出保留为 OGG,则需要在完成后将其转换回来。
我的经验主要是使用 MP3 库而不是 OGG,但我听说过关于JOrbis.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)