示例#1
0
        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());
                }
    }
示例#3
0
        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);
                    }
        }