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