private RTMAudioData GetAudioData(AudioClip clip) { var soundData = new float[clip.samples * clip.channels]; clip.GetData(soundData, 0); var newData = new float[position * clip.channels]; for (int i = 0; i < newData.Length; i++) { newData[i] = soundData[i]; } var newClip = AudioClip.Create(clip.name, position, clip.channels, clip.frequency, false, false); newClip.SetData(newData, 0); long duration = (long)(newClip.length * 1000); RTMAudioHeader rtmAudioHeader = new RTMAudioHeader(RTMAudioHeader.CurrentVersion, RTMAudioHeader.ContainerType.CodecInherent, RTMAudioHeader.CodecType.AmrWb, lang, duration, RECORD_SAMPLE_RATE); return(new RTMAudioData(rtmAudioHeader, GetRtmAudioData(rtmAudioHeader, newClip, duration), newData, duration, newClip.samples, RECORD_SAMPLE_RATE)); }
public RTMAudioData(RTMAudioHeader rtmAudioHeader, byte[] audio, float[] pcmData, long duration, int samples, int frequency) { this.rtmAudioHeader = rtmAudioHeader; this.audio = audio; this.pcmData = pcmData; this.duration = duration; this.samples = samples; this.frequency = frequency; }
private byte[] GetRtmAudioData(RTMAudioHeader rtmAudioHeader, AudioClip clip, long duration) { MemoryStream amrStream = new MemoryStream(); ConvertAndWriteWav(amrStream, clip); WriteWavHeader(amrStream, clip); byte[] amrArray = AudioConvert.ConvertToAmrwb(amrStream.ToArray()); MemoryStream audioStream = new MemoryStream(); byte[] rtmHeader = rtmAudioHeader.HeaderArray; audioStream.Write(rtmHeader, 0, rtmHeader.Length); audioStream.Write(amrArray, 0, amrArray.Length); return(audioStream.ToArray()); }
private void ParseAudioData(byte[] audio) { rtmAudioHeader = new RTMAudioHeader(); int offset = 0; if (audio.Length < 4) { return; } rtmAudioHeader.version = audio[0]; rtmAudioHeader.containerType = (RTMAudioHeader.ContainerType)audio[1]; rtmAudioHeader.codecType = (RTMAudioHeader.CodecType)audio[2]; byte infoDataCount = audio[3]; offset += 4; for (byte i = 0; i < infoDataCount; i++) { int sectionLength = BitConverter.ToInt32(audio, offset); offset += 4; Dictionary <Object, Object> infoData = MsgUnpacker.Unpack(audio, offset, sectionLength); object value; if (infoData.TryGetValue("lang", out value)) { rtmAudioHeader.lang = (string)value; } if (infoData.TryGetValue("dur", out value)) { rtmAudioHeader.duration = Convert.ToInt64(value); duration = rtmAudioHeader.duration; } if (infoData.TryGetValue("srate", out value)) { rtmAudioHeader.sampleRate = Convert.ToInt32(value); frequency = rtmAudioHeader.sampleRate; } offset += sectionLength; } if (offset >= audio.Length) { return; } byte[] amrBuffer = new byte[audio.Length - offset]; Array.Copy(audio, offset, amrBuffer, 0, audio.Length - offset); byte[] wavBuffer = AudioConvert.ConvertToWav(amrBuffer); int channelCount = wavBuffer[22]; int pos = 12; while (!(wavBuffer[pos] == 100 && wavBuffer[pos + 1] == 97 && wavBuffer[pos + 2] == 116 && wavBuffer[pos + 3] == 97)) { pos += 4; int chunkSize = wavBuffer[pos] + wavBuffer[pos + 1] * 256 + wavBuffer[pos + 2] * 65536 + wavBuffer[pos + 3] * 16777216; pos += 4 + chunkSize; } pos += 8; samples = (wavBuffer.Length - pos) / 2; pcmData = new float[samples]; int idx = 0; while (pos < wavBuffer.Length) { pcmData[idx] = BytesToFloat(wavBuffer[pos], wavBuffer[pos + 1]); pos += 2; idx++; } }