Unity develops Android to dynamically load external audio files

Unity2018.4.2ff Development Instructions for Android Loading External Audio Files
1. WWW mode, supports MP3 and WAV audio file formats
2. UnityWebRequest Method, UnityWebRequestMultimedia.GetAudioClip(readPath, _audioType) does not support MP3 format, but supports WAV format;
3. Neither WWW nor UnityWebRequest can use the Naudio.dll library file to create new wav files on the Android side.
(How does that big guy know the method, please tell it in the comments, thank you!!!)
The creation code is as follows:

       string _tempURL = _url.Replace(".mp3", ".wav");

        Debug.Log("_tempURL:: " + _tempURL);
        if (!File.Exists(_tempURL))
        {
    
    
            FileStream _fileStream = File.Open(_tempURL, FileMode.Open);//安卓端报错
            Mp3FileReader _mp3FileReader = new Mp3FileReader(_fileStream);
            WaveFileWriter.CreateWaveFile(_tempURL, _mp3FileReader);
        }

The code to load the audio file correctly looks like this:

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class LoadAudioManager : MonoSingleton<LoadAudioManager>
{
    
    
    /// <summary>
    /// 获取AudioClip,并添加到挂载AudioSource组件的物体上
    /// </summary>
    /// <param name="uiRoot">UIPanel的父类</param>
    /// <param name="floderName">音频文件所在的文件夹名称</param>
    public void GetAudioClip(Transform uiRoot, string floderName)
    {
    
    
        //动态添加UI上音频文件
        for (int i = 0; i < uiRoot.childCount; i++)
        {
    
    
            AudioSource audioSource = uiRoot.GetChild(i).GetComponent<AudioSource>();
            string audioName = uiRoot.GetChild(i).name;
            StartCoroutine(LoadExternalAudioWWW(audioSource, floderName, audioName));
        }
    }

    /// <summary>
    /// 加载外部音频文件,并添加到挂载AudioSource组件的物体上
    /// </summary>
    /// <param name="audioSource">AudioSource组件</param>
    /// <param name="floderName">音频所在的文件夹名称</param>
    /// <param name="audioName">音频名称</param>
    /// <returns></returns>
    public IEnumerator LoadExternalAudioWWW(AudioSource audioSource, string floderName, string audioName)//成功的方法
    {
    
    
        string loadPath;//读取文件的路径
        if (Application.platform == RuntimePlatform.Android)
        {
    
    
            loadPath = "/storage/emulated/0/ConfigFiles/Audios/" + floderName + "/" + audioName + ".mp3";
            //Debug.LogError($"安卓端音频读取::{loadPath},");
        }
        else
        {
    
    
            loadPath = Application.streamingAssetsPath + "/ConfigFiles/Audios/" + floderName + "/" + audioName + ".mp3";
            //Debug.Log($"PC端音频读取::{loadPath},");
        }

        var www = new WWW("file://" + loadPath);
        yield return www;
        var clip = www.GetAudioClip();
        audioSource.clip = clip;
    }

    /// <summary>
    /// 加载外部音频文件,并添加到挂载AudioSource组件的物体上
    /// </summary>
    /// <param name="audioSource">AudioSource组件</param>
    /// <param name="floderName">音频所在的文件夹名称</param>
    /// <param name="audioName">音频名称</param>
    /// <param name="_audioType">音频格式</param>
    /// <returns></returns>
    public IEnumerator LoadExternalAudioWebRequest(AudioSource audioSource, string floderName, string audioName, AudioType _audioType = AudioType.WAV)
    {
    
    
        string readPath;//读取文件的路径
        if (Application.platform == RuntimePlatform.Android)
        {
    
    
            readPath = "file:///sdcard/ConfigFiles/Audios/" + floderName + "/" + audioName + ".wav";
            Debug.LogError($"安卓端音频读取::{
      
      readPath},");
        }
        else
        {
    
    
            readPath = Application.streamingAssetsPath + "/ConfigFiles/Audios/" + floderName + "/" + audioName + ".wav";
            Debug.LogError($"PC端音频读取::{
      
      readPath},");
        }

        yield return null;
        UnityWebRequest _unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(readPath, _audioType);
        yield return _unityWebRequest.SendWebRequest();

        if (_unityWebRequest.isHttpError || _unityWebRequest.isNetworkError)
        {
    
    
            Debug.Log(_unityWebRequest.error.ToString());
        }
        else
        {
    
    
            AudioClip _audioClip = DownloadHandlerAudioClip.GetContent(_unityWebRequest);
            audioSource.clip = _audioClip;
            //audioSource.loop = true;
            //audioSource.Play();
        }
    }
}

Guess you like

Origin blog.csdn.net/U3DCoder/article/details/121471092