c# - 从汇编资源流式传输的音频快速、响亮且失真
问题描述
我正在尝试从程序集资源加载 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);
}
解决方案
推荐阅读
- python - 根据特定列值组合 Dataframe 上的行并添加其他值
- flutter - 将字符串转换为日期?
- c++ - 过多的光标引用突出显示 VS 社区
- python-3.x - 连接到外部 SQLite 数据库
- java - java - ScheduledThreadPoolExecutor 线程中的可见性
- python - 将当前图像转换为黑白
- jasper-reports - 如何在 Jasper Report 中对列的数据求和
- wpf - 如何在 WPF DataGrid 中禁用行选择
- powershell - Powershell如何检查文本文件是否为空并忽略空格
- ios - 尝试使用 switch 语句来更改图像集