首页 > 解决方案 > 从汇编资源流式传输的音频快速、响亮且失真

问题描述

我正在尝试从程序集资源加载 AudioClip(由 AudioSource 播放)。然而,在我目前的设置下,音频非常响亮,极度失真,播放速度大约是原来的两倍。它是一个 .wav 文件,作为资源包含在托管程序集中。有人知道我做错了什么吗?(我已经匹配了频率和频道)

private static AudioClip LoadAudioClip()
{
    // Try loading from resources first.
    AudioClip audioClip = Resources.Load<AudioClip>(AudioClipResourceFolder + Path.GetFileNameWithoutExtension(EmbeddedChime.FileName));

    if (audioClip == null)
    {
        // Nothing found in resources, load from library manifest instead.
        try
        {
            using (Stream stream = GetResourceStream(EmbeddedChime.FileName))
            {
                float[] buffer = GetAudioBuffer(stream);
                audioClip = AudioClip.Create("Chime", buffer.Length, 2, 44100, true, false);
                if (!audioClip.SetData(buffer, 0))
                {
                    throw new NotSupportedException(EmbeddedChime.FileName);
                }
            }
        }
        catch (Exception e)
        {
            AMDebug.LogError($"Failed to load {EmbeddedChime.FileName} from Assembly library manifest: " + e.Message);
        }
    }

    return audioClip;
}

private static float[] GetAudioBuffer(Stream stream)
{
    byte[] buffer = GetResourceBuffer(stream);
    
    float[] floatBuffer = new float[buffer.Length / 4];
    for (int i = 0; i < floatBuffer.Length; i++) 
    {
        if (BitConverter.IsLittleEndian)
        {
            Array.Reverse(buffer, i * 4, 4);
        }

        floatBuffer[i] = BitConverter.ToSingle(buffer, i*4) / 0x80000000;
    }

    return floatBuffer;
}

private static byte[] GetResourceBuffer(Stream stream)
{
    stream.Seek(0, SeekOrigin.Begin);
    byte[] buffer = new byte[stream.Length];
    stream.Read(buffer, 0, (int)stream.Length);
    return buffer;
}

private static Stream GetResourceStream(string resourceName)
{
    return AudioMobAssembly.GetManifestResourceStream(resourceName);
}

标签: c#unity3daudiostream.net-assembly

解决方案


推荐阅读