Как преобразовать Unity AudioClip в байтовый массив, подходящий для загрузки Firebase Storage - PullRequest
0 голосов
/ 01 мая 2019

Я использую Firebase Storage на Unity3D для хранения записей с микрофона от пользователя. Как преобразовать AudioClip в поток байтов, который можно загрузить в Firebase Storage?

Пока проект загружает звуковые файлы в нужное время, файлы, найденные в Firebase, не читаются ни одним плеером.

Я убедился, что:

  • На самом деле я получаю правильные неразрушенные записи, которые хочу загрузить.
  • Мой метод загрузки аудиоклипов работает для загрузки файлов с жесткого диска моего компьютера в Firebase (включая запись, которую я собираюсь загрузить), используя PutFileAsync (), а не PutBytesAsync ()
  • Мой проект также загружает изображения в тот же Firebase, эти изображения загружаются без проблем

Это приводит меня к выводу, что мое форматирование потока байтов неверно.

Мой текущий метод для преобразования текущей записи в байтовый массив для загрузки. Этот код был по существу скопирован из (https://github.com/steelejay/LowkeySpeech/blob/master/Code/SavWav.cs),, но вместо того, чтобы он записывал bytesData в файл, он вместо этого отправляет возвращаемые bytesData для загрузки в Firebase.

public byte[] returnByteArrayForCurrentRecording()
    {
        var samples = new float[audioClip.samples];

        audioClip.GetData(samples, 0);

        Int16[] intData = new Int16[samples.Length];

        Byte[] bytesData = new Byte[samples.Length * 2];

        int rescaleFactor = 32767;

        for (int i = 0; i < samples.Length; i++)
        {
            intData[i] = (short)(samples[i] * rescaleFactor);
            Byte[] byteArr = new Byte[2];
            byteArr = BitConverter.GetBytes(intData[i]);
            byteArr.CopyTo(bytesData, i * 2);
        }

        return bytesData;

    }

Мой метод, который берет байтовый массив из предыдущего метода и загружает его в Firebase.

string saveAudio(DatabaseReference objectReference)
    {
        microphoneRecorder.endAudioRecording();
        byte[] audioStream = microphoneRecorder.returnByteArrayForCurrentRecording();
        StorageReference objectAudioRef= audioRef.Child(objectReference.Key.ToString()+".mp3");
        objectAudioRef.PutBytesAsync(audioStream);
        return objectAudioRef.ToString();
    }

Я ожидаю, что это загрузит воспроизводимый mp3 в FirebaseStorage. Тем не менее, ни один из звуковых файлов, загруженных с помощью этого метода, не доступен для чтения на любом медиаплеере.

Как всегда, спасибо, что нашли время.

...