开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:404

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 222|回复: 7

[脚本] 88蛮牛币需求把二进制音频数据转为unity音频能用的float[]数据。有float[]数据转byte[]的例子

[复制链接]  [移动端链接]
5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
发表于 2017-1-12 18:06:25 | 显示全部楼层 |阅读模式
88蛮牛币
float[]数据转byte[]的静态方法。。。下例将音频数据取出为float[]然后借用int16[]替换数组数据,转成了byte[]数据。需求把这个方法调换一下。把二进制音频数据转为unity音频能用的float[]数据。
static void ConvertAndWrite(FileStream fileStream, AudioClip clip)  
    {  

        var samples = new float[clip.samples];  

        clip.GetData(samples, 0);  

        Int16[] intData = new Int16[samples.Length];  
        //converting in 2 float[] steps to Int16[], //then Int16[] to Byte[]  

        Byte[] bytesData = new Byte[samples.Length * 2];  
        //bytesData array is twice the size of  
        //dataSource array because a float converted in Int16 is 2 bytes.  

        int rescaleFactor = 32767; //to convert float to Int16  

        for (int i = 0; i < samples.Length; i++)  
        {  
            intData[i] = (short)(samples[i] * rescaleFactor);  
            Byte[] byteArr = new Byte[2];  
            byteArr = BitConverter.GetBytes(intData[i]);  
            byteArr.CopyTo(bytesData, i * 2);  
        }  

        fileStream.Write(bytesData, 0, bytesData.Length);  
    }  
我纠结了很久,但是转出来的是杂音。。。自身技术太差了唉


回复

使用道具 举报

5熟悉之中
789/1000
排名
3299
昨日变化
20

1

主题

143

帖子

789

积分

Rank: 5Rank: 5

UID
114156
好友
0
蛮牛币
1233
威望
0
注册时间
2015-7-18
在线时间
349 小时
最后登录
2017-3-27
发表于 2017-1-13 10:14:09 | 显示全部楼层
你要做什么功能?

回复

使用道具 举报

5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
 楼主| 发表于 2017-1-13 10:28:44 | 显示全部楼层
imsb 发表于 2017-1-13 10:14
你要做什么功能?

百度语音合成,那边得到的数据是二进制的MP3格式音频数据。在unity里面用www.audioClip也不行。因为不支持MP3格式。我昨天用另一种方法:把音频存为本地wav文件再加载出来也播放不了。

回复

使用道具 举报

5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
 楼主| 发表于 2017-1-13 10:32:20 | 显示全部楼层
@ OoSoSoO同学是这样转的float[]转 byte[]
public Byte[] GetClipData()
    {
        if (aud.clip == null)
        {
            Debug.LogError("录音数据为空");
            return null;
        }

        float[] samples = new float[aud.clip.samples];

        aud.clip.GetData(samples, 0);


        Byte[] outData = new byte[samples.Length * 2];

        int rescaleFactor = 32767; //to convert float to Int16   

        for (int i = 0; i < samples.Length; i++)
        {
            short temshort = (short)(samples[i] * rescaleFactor);

            Byte[] temdata = System.BitConverter.GetBytes(temshort);

            outData[i * 2] = temdata[0];
            outData[i * 2 + 1] = temdata[1];
        }
        if (outData == null || outData.Length <= 0)
        {
            Debug.LogError("录音数据为空");
            return null;
        }

        //return SubByte(outData, 0, audioLength * 8000 * 2);
        return outData;
    }

回复

使用道具 举报

5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
 楼主| 发表于 2017-1-13 10:33:48 | 显示全部楼层
imsb 发表于 2017-1-13 10:14
你要做什么功能?

做语音合成

回复

使用道具 举报

5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
 楼主| 发表于 2017-1-13 11:57:55 | 显示全部楼层
static void ConvertAndWrite(Byte[] bytesData, AudioClip clip)//传参(我目前得到的数据,目标音频)
    {

        float[] samples = new float[bytesData.Length/2];

        int rescaleFactor = 32767;//这个固定值暂时未知


        for (int i = 0; i < samples.Length; i++)//开始转换了
        {
            short temshort = (short)(samples[i] * rescaleFactor);

            byte[] temdata = new Byte[2];

            temdata[0] = bytesData[i * 2];
            temdata[1] = bytesData[i * 2 + 1];

            temshort = BitConverter.ToInt16(temdata, 0);
            samples[i] = (float)(temshort / rescaleFactor);
        }
        //clip.GetData(samples, 0);//音频数据存到浮点数组中
        clip.SetData(samples, 0);
我这样翻转这个方法,得到杂音!

回复

使用道具 举报

7日久生情
4899/5000
排名
2363
昨日变化
10

4

主题

3969

帖子

4899

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
78862
好友
3
蛮牛币
15817
威望
0
注册时间
2015-3-11
在线时间
494 小时
最后登录
2017-3-28
QQ
发表于 2017-1-14 10:09:11 来自Mobile--- | 显示全部楼层
www是可以加载wav的啊,是你搞的不对吧

回复

使用道具 举报

5熟悉之中
901/1000
排名
2702
昨日变化
8

7

主题

249

帖子

901

积分

Rank: 5Rank: 5

UID
45034
好友
1
蛮牛币
2279
威望
0
注册时间
2014-9-15
在线时间
283 小时
最后登录
2017-3-27
 楼主| 发表于 2017-1-16 09:04:10 | 显示全部楼层
lilexy 发表于 2017-1-14 10:09
www是可以加载wav的啊,是你搞的不对吧

网上下的wav可以加载的,但是我自己保存下来的不能加载。报错是空的红色感叹号。大神有兴趣测试一下我保存的wav文件吗?或者你也去获取一下那个二进制音频文件来保存一下。。。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表