Unity3d C# 实现mp3的字节数组byte[] 转AudioClip并播放(含源码)

前言

最近在弄一个语音合成相关的接口,其中合成的语音会通过byte[]返回,如果保存的话是没有任何问题的,不过要是试听的话就很麻烦,网上的方法大多是WAV的,尝试几次后发现播放的声音都是有问题的。期间,看到一种思路就是先将其保存为文件,之后将文件加载成AudioClip,再播放。根据这种思路实现了这个功能。

实现过程

不过比较简单暴力,目前在编辑器下测试没问题,其它平台暂未测试。

保存文件

  string VoiceUrl = Application.persistentDataPath + "/temp.mp3"; //存储路径
  File.WriteAllBytes(VoiceUrl, bytes);  //写入文件

这里bytes就是mp3的数据即字节数组。

加载文件播放

   IEnumerator DoVioceClip()
    {
        UnityWebRequest uwr = UnityWebRequestMultimedia.GetAudioClip(VoiceUrl, AudioType.MPEG);
        {
            yield return uwr.SendWebRequest();
            if (uwr.isNetworkError)
                Debug.LogError(uwr.error);
            else
             {
                AS.clip = DownloadHandlerAudioClip.GetContent(uwr);
                AS.Play();
             }
        }
    }

如上过程,比较简单明了。调用方式:

     StartCoroutine(DoVioceClip());
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
可以使用Unity提供的`AudioClip.LoadAudioData()`方法,该方法可以将音频数据加载到指定的`AudioClip`中。以下是一个获取StreamingAssets文件夹下多个mp3并放入一个audioclip数组的示例代码: ```csharp using UnityEngine; using System.Collections; using System.IO; public class LoadAudioClips : MonoBehaviour { public AudioClip[] audioClips; IEnumerator Start () { // 获取StreamingAssets文件夹路径 string path = Application.streamingAssetsPath + "/Audio/"; // 获取文件夹内的所有mp3文件 DirectoryInfo dir = new DirectoryInfo(path); FileInfo[] files = dir.GetFiles("*.mp3"); // 创建AudioClip数组 audioClips = new AudioClip[files.Length]; // 遍历mp3文件 for (int i = 0; i < files.Length; i++) { WWW www = new WWW(files[i].FullName); // 等待音频数据加载完成 yield return www; // 创建AudioClip AudioClip clip = AudioClip.Create(files[i].Name, (int)(www.audioClip.length * www.audioClip.frequency), www.audioClip.channels, www.audioClip.frequency, false); clip.SetData(www.audioClip.GetData(), 0); // 将AudioClip添加到数组audioClips[i] = clip; // 释放WWW对象 www.Dispose(); } } } ``` 在上面的代码中,我们首先获取StreamingAssets文件夹路径,并获取该文件夹内的所有mp3文件。然后,我们创建一个AudioClip数组,遍历mp3文件,并使用`WWW`类加载音频数据。在音频数据加载完成后,我们创建一个新的`AudioClip`对象,并使用`SetData()`方法将音频数据复制到新的`AudioClip`中。最后,我们将`AudioClip`添加到数组中,并释放`WWW`对象。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十幺卜入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值