Я закодировал wav файл в base64 (audioClipName.txt в Ресурсах/Звуках).
Затем я попытался декодировать его, сделать из него AudioClip и воспроизвести его следующим образом:
public static void CreateAudioClip()
{
string s = Resources.Load<TextAsset> ("Sounds/audioClipName").text;
byte[] bytes = System.Convert.FromBase64String (s);
float[] f = ConvertByteToFloat(bytes);
AudioClip audioClip = AudioClip.Create("testSound", f.Length, 2, 44100, false, false);
audioClip.SetData(f, 0);
AudioSource as = GameObject.FindObjectOfType<AudioSource> ();
as.PlayOneShot (audioClip);
}
private static float[] ConvertByteToFloat(byte[] array)
{
float[] floatArr = new float[array.Length / 4];
for (int i = 0; i < floatArr.Length; i++)
{
if (BitConverter.IsLittleEndian)
Array.Reverse(array, i * 4, 4);
floatArr[i] = BitConverter.ToSingle(array, i * 4);
}
return floatArr;
}
Все отлично работает, за исключением того, что звук - это всего лишь один шум.
Я нашел этот здесь в переполнении стека, но ответ dosnt решил проблему.
Вот подробности о wav файле из Unity3D:
Кто-нибудь знает, в чем проблема?
ИЗМЕНИТЬ
Я записал двоичные файлы, один сразу после декодирования из base64, второй после окончательной конвертации и сравнил его с исходным двоичным wav файлом:
Как вы можете видеть, файл был закодирован правильно, потому что он просто декодирует его и записывает файл следующим образом:
string scat = Resources.Load<TextAsset> ("Sounds/test").text;
byte[] bcat = System.Convert.FromBase64String (scat);
System.IO.File.WriteAllBytes ("Assets/just_decoded.wav", bcat);
предоставили те же файлы. Все файлы имеют некоторую длину.
Но последнее неверно, поэтому проблема заключается в преобразовании в массив float. Но я не понимаю, что может быть неправильно.
EDIT:
Вот код для записи final.wav:
string scat = Resources.Load<TextAsset> ("Sounds/test").text;
byte[] bcat = System.Convert.FromBase64String (scat);
float[] f = ConvertByteToFloat(bcat);
byte[] byteArray = new byte[f.Length * 4];
Buffer.BlockCopy(f, 0, byteArray, 0, byteArray.Length);
System.IO.File.WriteAllBytes ("Assets/final.wav", byteArray);