是否可以将字节数组转换为AudioClip?

时间:2019-04-09 14:05:31

标签: c# arrays unity3d audio ogg

我正在使用游戏引擎 Unity 开发一个跨平台应用程序,该应用程序简单地从用<创建的存储桶中提取图像和音频文件( .ogg )。 strong> Amazon Simple Storage Service ( Amazon S3 )。将以字节表示的音频文件转换为AudioClips时遇到问题。

我已经尝试了两个链接的解决方案:

create AudioClip from byte

Noisy audio clip after decoding from base64

但这两种解决方案都不能解决我的问题,从字节到数组的转换过程之后仍然存在静态声音。

我尝试过的另一种解决方案是使用 UnityWebRequestMultimedia ,并从存储桶中每个对象所具有的url中获取音频。该解决方案仅适用于应用程序的独立版本(PC,Linux,Mac OS)。当我在以Android为操作系统的智能手机上尝试应用程序时,UnityWebRequestMultimedia不会发送请求,这就是为什么我再次尝试将从 S3 获取的对象的字节转换为audioclip。

S3上的每个音频文件都是具有以下属性的 .ogg 文件:

Properties of every file audio file

//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;
        }

我只是希望音频能够正确播放而没有静电噪声。

1 个答案:

答案 0 :(得分:0)

只要数据存储在未压缩的原始PCM流中,您所做的一切就可以正常运行-有所有理由可以正常工作。如果不是,则与从JPG文件读取字节并希望在其中找到颜色的类型相同。您将需要先将数据输入适当的解码器

快速的Google允许我找到此链接 https://archive.codeplex.com/?p=nvorbis

我自己没有使用过它,但是看起来很合适。或者,您可以链接到.dll并使用一些PInvokes在非托管端进行解码