我正在使用游戏引擎Unity制作一个跨平台应用程序,它只是从使用Amazon Simple Storage Service(Amazon S3)制作的存储桶中获取图像和音频文件(.ogg)。我将转换音频文件(以字节为单位)转换为AudioClip时遇到问题。
我已经尝试过两个链接的解决方案:
Noisy audio clip after decoding from base64
但是这两个解决方案都没有解决我的问题,转换过程之后仍然存在从字节到数组的静态声音。
我尝试的另一个解决方案是使用UnityWebRequestMultimedia并从每个对象在存储桶中的url中获取音频。此解决方案仅适用于应用程序的独立版本(PC,Linux,Mac OS)。当我在智能手机上尝试我的应用程序时,使用Android作为操作系统,UnityWebRequestMultimedia不会发送请求,这就是为什么我要再次尝试将从S3获取的对象的字节转换为audioclip。
S3上的每个音频文件都是具有以下属性的.ogg文件:
//Method that takes the bytes of the audioclip
private AudioClip GetMediaBytesFromS3 (Amazon.Runtime.AmazonServiceResult<GetObjectRequest,GetObjectResponse> ServiceResult,string nameOfAudio)
{
//Take the bytes of the audio
byte[] mediaBytes = GetBytesFromMultimediaObject(ServiceResult);
//Make a float array
float[] floatMediaBytes = new float[mediaBytes.Length / 4];
for(int i=0;i<floatMediaBytes.Length; i++)
{
//Check if the architecture use the LittleEndian ordering of Bytes
if(BitConverter.IsLittleEndian)
{
Array.Reverse(mediaBytes,i*4,4);
}
floatMediaBytes[i] = ((float) BitConverter.ToInt16(mediaBytes,i*4)) / 0x80000000;
}
//Make a new audioclip
AudioClip clipAudio = AudioClip.Create(nameOfAudio,floatMediaBytes.Length,1,16000,false);
//See if the data are set
if(clipAudio.SetData(floatMediaBytes,28))
{
return clipAudio;
}
return null;
}
我只是想在没有静电噪声的情况下正确播放音频。
你正在做的事情看起来很好 - 只要数据存储在未经压缩的原始PCM流中,所有理由都可以正常工作。如果不是 - 那就像从JPG文件中读取字节一样,并期望在那里找到颜色。您需要先将数据提供给适当的解码器
快速谷歌允许我找到这个链接https://archive.codeplex.com/?p=nvorbis
我自己没有用它,但似乎符合要求。或者,您可以链接到.dll并使用一些PInvokes在非托管端进行解码