如何将Unity AudioClip转换为适合Firebase存储上传的字节数组

时间:2019-05-01 17:18:29

标签: c# unity3d byte firebase-storage audioclip

我正在Unity3D上使用Firebase Storage来存储用户的麦克风录音。如何将AudioClip转换为可上传到Firebase存储的字节流?

项目在适当的时间上传声音文件时,在Firebase中找到的文件不能被任何播放器读取。

我已经确保:

  • 我实际上正在获取想要上传的正确无损坏的录音。
  • 我的上载音频剪辑方法适用于使用PutFileAsync()而不是PutBytesAsync()将文件从计算机硬盘驱动器上载到Firebase(包括我打算上载的记录)
  • 我的项目还将图片上传到同一Firebase,这些图片上传没有问题

这使我得出结论,我的字节流格式不正确。

我当前将当前记录转换为字节数组以供上传的方法。这段代码本质上是从(https://github.com/steelejay/LowkeySpeech/blob/master/Code/SavWav.cs)复制而来的,但是它没有将bytesData写入文件,而是发送了返回的byteData来上传到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。但是,任何媒体播放器都无法读取使用此方法上传的声音文件。

一如既往,感谢您抽出宝贵的时间。

0 个答案:

没有答案