c# – 从base64解码后的噪音音频剪辑

c# – 从base64解码后的噪音音频剪辑,第1张

概述我在base64(资源/声音中的audioClipName.txt)编码wav文件. HERE IS THE SOURCE WAVE FILE 然后我试图解码它,从它制作一个AudioClip,并播放它像这样: public static void CreateAudioClip(){ string s = Resources.Load<TextAsset> ("Sounds/audio 我在base64(资源/声音中的audioClipname.txt)编码wav文件.

HERE IS THE SOURCE WAVE FILE

然后我试图解码它,从它制作一个AudioClip,并播放它像这样:

public static voID CreateAudioClip(){    string s = Resources.Load<TextAsset> ("Sounds/audioClipname").text;    byte[] bytes = System.Convert.FromBase64String (s);    float[] f = ConvertBytetofloat(bytes);    AudioClip audioClip = AudioClip.Create("testSound",f.Length,2,44100,false,false);    audioClip.SetData(f,0);    AudioSource as = GameObject.FindobjectOfType<AudioSource> ();    as.PlayOneshot (audioClip);}private static float[] ConvertBytetofloat(byte[] array) {    float[] floatArr = new float[array.Length / 4];    for (int i = 0; i < floatArr.Length; i++)     {        if (BitConverter.IslittleEndian)             Array.Reverse(array,i * 4,4);        floatArr[i] = BitConverter.ToSingle(array,i * 4);    }    return floatArr;}

每件事情都可以正常工作,除了声音只是一个噪音.

我在这里发现了this堆栈溢出,但是答案dosnt解决了问题.

以下是Unity3D的wav文件的详细信息:

有人知道这里有什么问题吗?

编辑

我写下二进制文件,一个是从base64解码之后,最后一次转换后再比较它,并将它与原来的二进制wav文件进行比较:

正如你所看到的那样,文件被正确编码,因为它只是解码它并且写下这个文件:

string scat = Resources.Load<TextAsset> ("Sounds/test").text;byte[] bcat = System.Convert.FromBase64String (scat);System.IO.file.WriteallBytes ("Assets/just_decoded.wav",bcat);

给出相同的文件.所有文件都有一些长度.

但是最后一个是错误的,所以问题是转换成float数组的地方.但我不明白可能是错的.

编辑:

这是写入final.wav的代码:

string scat = Resources.Load<TextAsset> ("Sounds/test").text;byte[] bcat = System.Convert.FromBase64String (scat);float[] f = ConvertBytetofloat(bcat);byte[] byteArray = new byte[f.Length * 4];Buffer.Blockcopy(f,byteArray,byteArray.Length);System.IO.file.WriteallBytes ("Assets/final.wav",byteArray);
解决方法 您尝试播放的wave文件(meow.wav)具有以下属性:

> PCM
> 2个频道
> 44100 Hz
>签署了16位小端

您的主要错误是,您正在将二进制数据解释为已经代表浮点数.这就是BitConverter.ToSingle()所做的.

但是,您需要做的是,从每两个字节创建一个带符号的16位小端值(如Wavefile-header中指定的),将其转换为浮点数,然后将其归一化.并且每两个字节在您的文件(16位!)的情况下做一个样本,而不是四个字节.数据是小端(s16le),所以如果主机没有,你只需要交换它.

这将是修正后的转换功能:

private static float[] ConvertBytetofloat(byte[] array) {    float[] floatArr = new float[array.Length / 2];    for (int i = 0; i < floatArr.Length; i++) {        floatArr[i] = ((float) BitConverter.ToInt16(array,i * 2))/32768.0;    }    return floatArr;}

你应该跳过你的wave文件的标题(真实的音频数据从偏移44开始).

对于干净的解决方案,您必须正确解释Wave标题,并根据所指定的内容调整 *** 作(如果包含不受支持的参数,则调整).例如,必须注意样本格式(每采样位数和字节数),采样率和通道数.

总结

以上是内存溢出为你收集整理的c# – 从base64解码后的噪音音频剪辑全部内容,希望文章能够帮你解决c# – 从base64解码后的噪音音频剪辑所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1259066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存