如何在Unity中不依赖物理存储将Base64 MP3转为AudioClip?
问题:无物理存储前提下将Base64 MP3转为Unity AudioClip
我尝试过直接解析Base64转成的字节数组,编写了以下代码:
private float[] Normalize(float[] data) { float max = float.MinValue; for (int i = 0; i < data.Length; i++){ if (System.Math.Abs(data[i]) > max) max = System.Math.Abs(data[i]); } for (int i = 0; i < data.Length; i++) data[i] = data[i] / max; return data; } private float[] ConvertByteToFloat(byte[] array){ float[] floatArr = new float[array.Length / 4]; for (int i = 0; i < floatArr.Length; i++){ if (System.BitConverter.IsLittleEndian) System.Array.Reverse(array, i * 4, 4); floatArr[i] = System.BitConverter.ToSingle(array, i * 4) ; } return Normalize(floatArr); } byte[] bytes = System.Convert.FromBase64String(data); float[] f = ConvertByteToFloat(bytes); qa[i] = AudioClip.Create("qjAudio", f.Length, 2, 44100, false); qa[i].SetData(f,0);
但播放生成的AudioClip时只能听到随机噪音。
也有人建议先将Base64转成的字节写入本地临时文件,再通过UnityWebRequest读取:
[SerializeField] private AudioSource _audioSource; private void Start() { StartCoroutine(ConvertBase64ToAudioClip(EXAMPLE_BASE64_MP3_STRING, _audioSource)); } IEnumerator ConvertBase64ToAudioClip(string base64EncodedMp3String, AudioSource audioSource) { var audioBytes = Convert.FromBase64String(base64EncodedMp3String); var tempPath = Application.persistentDataPath + "tmpMP3Base64.mp3"; File.WriteAllBytes(tempPath, audioBytes); UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(tempPath, AudioType.MPEG); yield return request.SendWebRequest(); if (request.result.Equals(UnityWebRequest.Result.ConnectionError)) Debug.LogError(request.error); else { audioSource.clip = DownloadHandlerAudioClip.GetContent(request); audioSource.Play(); } File.Delete(tempPath); }
但这个方案在Android设备上需要申请存储权限,会降低用户体验,还得处理权限被拒绝的情况,增加开发复杂度。
请问如何在不依赖物理存储的前提下,正确将Base64格式的MP3字符串转为AudioClip?
内容的提问来源于stack exchange,提问作者Chong Lip Phang
相关产品推荐
相关产品推荐

