我在 Unity3D 上使用 Firebase 存储来存储用户的麦克风录音。如何将 AudioClip 转换为可以上传到 Firebase 存储的字节流?
当项目在适当的时间上传声音文件时,任何玩家都无法读取在 Firebase 中找到的文件。
我已经确定:
- 我实际上正在获取我希望上传的正确未损坏的录音。
- 我的上传音频剪辑方法适用于使用 PutFileAsync() 而不是 PutBytesAsync() 将文件从我的计算机硬盘上传到 Firebase(包括我打算上传的录音)
- 我的项目还将图片上传到同一个 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。但是,任何媒体播放器都无法读取使用此方法上传的声音文件。
一如既往,感谢您抽出宝贵时间。