コード例 #1
0
        private void ParseAudioData()
        {
            byte[] wavBuffer = AudioConvert.ConvertToWav(audio);

            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;

            lengthSamples = (wavBuffer.Length - pos) / 2;

            pcmData = new float[lengthSamples];

            int idx = 0;

            while (pos < wavBuffer.Length)
            {
                pcmData[idx] = BytesToFloat(wavBuffer[pos], wavBuffer[pos + 1]);
                pos         += 2;
                idx++;
            }
        }
コード例 #2
0
        public void Play(RTMAudioData data)
        {
#if UNITY_ANDROID
            if (AudioRecord != null)
            {
                AudioRecord.Call("broadAudio", AudioConvert.ConvertToWav(data.Audio));
            }
#elif (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN)
            byte[] wavBuffer = AudioConvert.ConvertToWav(data.Audio);
            startPlay(wavBuffer, wavBuffer.Length, PlayFinishCallback);
#else
            startPlay(data.Audio, data.Audio.Length, PlayFinishCallback);
#endif
        }
コード例 #3
0
        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++;
            }
        }