unsafe private void ProcessAudioFrame(AudioMediaFrame audioMediaFrame) { using (AudioFrame audioFrame = audioMediaFrame.GetAudioFrame()) using (AudioBuffer buffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read)) using (IMemoryBufferReference reference = buffer.CreateReference()) { byte * dataInBytes; uint capacityInBytes; float *dataInFloat; ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes); // The requested format was float dataInFloat = (float *)dataInBytes; // Get the number of samples by multiplying the duration by sampling rate: // duration [s] x sampling rate [samples/s] = # samples // Duration can be gotten off the frame reference OR the audioFrame TimeSpan duration = audioMediaFrame.FrameReference.Duration; // frameDurMs is in milliseconds, while SampleRate is given per second. uint frameDurMs = (uint)duration.TotalMilliseconds; uint sampleRate = audioMediaFrame.AudioEncodingProperties.SampleRate; uint sampleCount = (frameDurMs * sampleRate) / 1000; } }
unsafe private void ProcessAudioFrame(AudioMediaFrame audioMediaFrame) { using (AudioFrame audioFrame = audioMediaFrame.GetAudioFrame()) using (AudioBuffer buffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read)) using (IMemoryBufferReference reference = buffer.CreateReference()) { byte *dataInBytes; uint capacityInBytes; ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes); float *dataInFloat = (float *)dataInBytes; TimeSpan duration = audioMediaFrame.FrameReference.Duration; uint frameDurMs = (uint)duration.TotalMilliseconds; uint sampleRate = audioMediaFrame.AudioEncodingProperties.SampleRate; uint sampleCount = (frameDurMs * sampleRate) / 1000; // Only send input signals of 1st~5th channel byte[] buf = new byte[4 * (5 * sampleCount + 3)]; fixed(byte *pBufByte = buf) { float *pBufFloat = (float *)pBufByte; uint * pBufUint = (uint *)pBufByte; pBufUint[0] = 5; pBufUint[1] = sampleCount; pBufUint[2] = sampleRate; for (uint i = 0; i < 5 * sampleCount; i++) { uint frameIdx = i / 5; uint channelIdx = i % 5; pBufFloat[3 + 5 * frameIdx + channelIdx] = dataInFloat[11 * frameIdx + channelIdx]; } } audioStream.WriteAsync(buf.AsBuffer()); } }
private unsafe void ProcessAudioFrame(AudioMediaFrame audioMediaFrame) { using (AudioFrame audioFrame = audioMediaFrame.GetAudioFrame()) using (AudioBuffer buffer = audioFrame.LockBuffer(AudioBufferAccessMode.Read)) using (IMemoryBufferReference reference = buffer.CreateReference()) { ((IMemoryBufferByteAccess)reference).GetBuffer(out var dataInBytes, out _); // The requested format was float var dataInFloat = (float *)dataInBytes; // Get the number of samples by multiplying the duration by sampling rate: // duration [s] x sampling rate [samples/s] = # samples // Duration can be gotten off the frame reference OR the audioFrame TimeSpan duration = audioMediaFrame.FrameReference.Duration; // frameDurMs is in milliseconds, while SampleRate is given per second. uint frameDurMs = (uint)duration.TotalMilliseconds; uint sampleRate = audioMediaFrame.AudioEncodingProperties.SampleRate; uint channelCount = audioMediaFrame.AudioEncodingProperties.ChannelCount; uint sampleCount = (frameDurMs * sampleRate) / 1000; // extract data and convert to mono float[] floats = new float[sampleCount]; if (channelCount > 1) { for (uint i = 0; i < sampleCount * channelCount; i += channelCount) { var sum = 0f; for (var j = 0; j < channelCount; j++) { sum += dataInFloat[i + j]; } floats[i / channelCount] = sum / channelCount; } } else { for (var i = 0; i < sampleCount; i += 1) { floats[i] = dataInFloat[i]; } } // downsample if (sampleRate > 16000) { floats = Utils.Audio.DownsampleBuffer(floats, sampleRate, 16000); } //if (!this.initialised) //{ // var storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder; // p = Path.Combine(storageFolder.Path, "out-2.wav"); // Debug.WriteLine(storageFolder.Path); // // pushStream.Write(this.CreateWavHeader()); // this.initialised = true; // wav.AddRange(this.CreateWavHeader()); //} // TOMAS's WAY var newBuffer = Utils.Audio.ToByteArray(floats); messageStream.WriteAsync(newBuffer.AsBuffer()); pushStream.Write(newBuffer); } }