Можно ли конвертировать массив байтов в AudioClip? - PullRequest
1 голос
/ 09 апреля 2019

Я создаю кроссплатформенное приложение с игровым движком Unity , которое просто берет изображения и аудиофайлы ( .ogg ) из корзины, созданной с Amazon Simple Storage Service ( Amazon S3 ).У меня проблема с преобразованием аудиофайлов, представленных в байтах, в AudioClips.

Я уже пробовал решения по обеим ссылкам:

создать AudioClip из байта

Шумный аудиоклип после декодирования из base64

Но оба решения не решают мою проблему, после преобразования из байтов в массив сохраняется статический звук.

Другое решение, которое я попробовал, состоит в том, чтобы использовать UnityWebRequestMultimedia и извлекать аудио из URL, который есть у каждого объекта в корзине.Это решение работает только в автономной версии приложения (ПК, Linux, Mac OS).Когда я пытаюсь установить приложение на смартфоне с ОС Android в качестве ОС, UnityWebRequestMultimedia не отправляет запрос, и поэтому я снова пытаюсь преобразовать байты объекта, взятые из S3 , в аудиоклип.

Каждый аудиофайл на 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 голосов
/ 10 апреля 2019

То, что вы делаете, выглядит вполне нормально - у этого есть все причины для правильной работы - до тех пор, пока данные хранятся в необработанном, несжатом потоке PCM. Если это не так - это своего рода чтение байтов из файла JPG и ожидание найти цвета там. Сначала вам нужно будет передать данные в соответствующий декодер

Быстрый Google позволил мне найти эту ссылку https://archive.codeplex.com/?p=nvorbis

Я сам этим не пользовался, но, похоже, это отвечает всем требованиям. В качестве альтернативы вы можете связать с .dll и выполнить декодирование на неуправляемой стороне, используя несколько PInvokes

...