public static ViChatPacket DeSerializer(byte[] buffer, int offest) { ViChatPacket packet = new ViChatPacket(); packet.Length = BitConverter.ToInt32(buffer, offest); packet.DataLength = BitConverter.ToInt32(buffer, offest + 4); packet.Data = new byte[packet.Length]; Buffer.BlockCopy(buffer, offest + 8, packet.Data, 0, packet.Length); // return(packet); }
public static byte[] Serializer(ViChatPacket packet) { byte[] buffer = new byte[8 + packet.Data.Length]; byte[] lengthBuffer = BitConverter.GetBytes(packet.Length); Buffer.BlockCopy(lengthBuffer, 0, buffer, 0, lengthBuffer.Length); // byte[] dataLengtBuffer = BitConverter.GetBytes(packet.DataLength); Buffer.BlockCopy(dataLengtBuffer, 0, buffer, 4, dataLengtBuffer.Length); // for (int iter = 0; iter < packet.Data.Length; ++iter) { buffer[8 + iter] = packet.Data[iter]; } // return(buffer); }
private void TransmitBuffer(float[] sampleBuffer) { int length = 0; byte[] buffer = ViSpeexCompress.SpeexCompress(sampleBuffer, out length); ViChatPacket packet = new ViChatPacket(); byte[] availableSampleBuffer = new byte[length]; Buffer.BlockCopy(buffer, 0, availableSampleBuffer, 0, length); packet.Data = availableSampleBuffer; packet.Length = length; packet.DataLength = buffer.Length; if (OnReSampleCompleteCallback != null) { OnReSampleCompleteCallback(packet); } }
//根据byte数组,得到一个声音片段 public AudioClip BytesToAudioClip(byte[] buffer) { //byte数组和声音长度的换算 这里暂时不知道稳不稳定 float _nAudioTime = buffer.Length / ByteInLengthPropotion; //长度不难为0否则会报错 if (_nAudioTime <= 0.1f) { _nAudioTime = 0.1f; } //创建声音片段,取样大小==声音长度*频率 AudioClip clip = AudioClip.Create("AA", (int)(_nAudioTime * RecordFrequency), 1, RecordFrequency, false); //将_list反序列成完整的声音包列表 List <ViChatPacket> list = new List <ViChatPacket>(); int offest = 0; while (offest < buffer.Length) { ViChatPacket packet = ViChatPacketSerializer.DeSerializer(buffer, offest); offest = offest + 8 + packet.Data.Length; //8和包长度可能是这个声音包的包头 list.Add(packet); } int sampleIndex = 0; NSpeex.SpeexDecoder _speexDec = new NSpeex.SpeexDecoder(NSpeex.BandMode.Narrow); //解析器 for (int i = 0; i < list.Count; ++i) { //取反序列化的声音包 ViChatPacket iterPacket = list[i]; //包内数据拷贝到数组 byte[] sampleData = new byte[iterPacket.DataLength]; Buffer.BlockCopy(iterPacket.Data, 0, sampleData, 0, iterPacket.Length); //解压 float[] sample = ViSpeexCompress.DeCompress(_speexDec, sampleData, iterPacket.Length); //将数据添加到声音片段 clip.SetData(sample, sampleIndex); sampleIndex += sample.Length; } return(clip); }
//每帧记录声音float[]转byte[] void TransmitBuffer(float[] sampleBuffer) { //压缩语音: //得到声音包长度 int length = 0; byte[] buffer = ViSpeexCompress.SpeexCompress(sampleBuffer, out length); //创建声音包 ViChatPacket packet = new ViChatPacket(); //拷贝压缩数据 byte[] availableSampleBuffer = new byte[length]; Buffer.BlockCopy(buffer, 0, availableSampleBuffer, 0, length); //赋值声音包 packet.Data = availableSampleBuffer; packet.Length = length; packet.DataLength = buffer.Length; //记录缓存 OnRecordSample(packet); }
public void PlayReconding(byte[] buffer, Action action = null) { audioSource.clip = AudioClip.Create("AA", 30 * 8000, 1, 8000, false); //byte[] buffer = _list.ToArray(); //Debug.Log("Length : " + buffer.Length.ToString()); List <ViChatPacket> list = new List <ViChatPacket>(); int offest = 0; while (offest < buffer.Length) { ViChatPacket packet = ViChatPacketSerializer.DeSerializer(buffer, offest); offest = offest + 8 + packet.Data.Length; list.Add(packet); } // int sampleIndex = 0; for (int iter = 0; iter < list.Count; ++iter) { ViChatPacket iterPacket = list[iter]; byte[] sampleData = new byte[iterPacket.DataLength]; Buffer.BlockCopy(iterPacket.Data, 0, sampleData, 0, iterPacket.Length); float[] sample = ViSpeexCompress.DeCompress(_speexDec, sampleData, iterPacket.Length); audioSource.clip.SetData(sample, sampleIndex); sampleIndex += sample.Length; } AudioManager.Instance.PlayEffectAudio(audioSource.clip, action); //audioSource.Play(); Debug.Log(audioSource.clip.length); //if (action != null) //{ // TimerMgr.instance.Subscribe(audioSource.clip.length * Time.timeScale, false, TimeEventType.IngoreTimeScale).OnComplete(delegate () // { // if (action != null) { action(); } // }); //} }
private void _ReSample(ViChatPacket packet) { _list.AddRange(ViChatPacketSerializer.Serializer(packet)); }
/// 采样数据 //录音过程中,保存采样包 void OnRecordSample(ViChatPacket packet) { _sampleDataList.AddRange(ViChatPacketSerializer.Serializer(packet)); }