Unity处理MP3流播放

Unity处理MP3流播放

PCMReaderCallback回调

Unity音频数据是通过AudioClip去处理的,它提供了PCMReaderCallback回调,用于加载流音频数据。它的声明如下:

public static AudioClip Create(string name, int lengthSamples, int channels, int frequency, bool stream, AudioClip.PCMReaderCallback pcmreadercallback);

 

public delegate void PCMReaderCallback(float[] data);

PCMReaderCallback中的PCM指的是音频数据格式,下面会讲到。在stream模式下,lengthSamples表示播放时,每次循环处理的sample数,这会影响到回调参数data的大小。回调函数参数data就是需要填充的音频数据,它的格式是PCM,data的长度可以由lengthSamples * channels计算出来。

值得注意的是,PCMReaderCallback执行环境不一定,它是由Unity回调的,可能是主线程,也可能是子线程。所以当它卡住的时候,可能会卡掉整个应用。

PCM格式

PCM是Pulse Code Modulation的缩写,它是未压缩的音频数据格式,也是声卡能接受的格式。PCM包含一系列的sample,每个sample代表的是音频声音有多大。单个sample可以用不同的bit depth去记录,有PCM8,PCM16,PCM24,PCM32等,其中最通用的是PCM16。

Unity中我们主要关注PCM float格式,因为这是PCMReaderCallback需要的格式。PCM float一般是一组介于-1到1的浮点数,也就是用1代表最大声音。下面PCM16转PCM float的代码,出自AudioStream插件。

#region audio byte array

public static int ByteArrayToFloatArray(byte[] byteArray, uint byteArray_length, ref float[] resultFloatArray)

{

 if (resultFloatArray == null || resultFloatArray.Length != (byteArray_length / 2))

   resultFloatArra

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值