从byte []数据包播放实时音频流

时间:2018-03-27 13:44:32

标签: c# audio stream byte

我试图播放以太网麦克风提供的声音。

设备流通过udp数据包直播音频,我在网络接收器线程中读取:

MemoryStream msAudio = new MemoryStream();

private void process_stream(byte[] buffer)
{
    msAudio.Write(fragment, 0, fragment.Length);
}

在任务中调用process_stream

然后我有另一个任务来播放NAudio中的流(NAudio不是必须的):

  while (IsConnected)
        {
            msAudio.Position = 0;
            var waveFormat = new WaveFormat(8000, 16, 1); // Same format
            using (WaveStream blockAlignedStream = new BlockAlignReductionStream(
                                                            WaveFormatConversionStream.CreatePcmStream(
                                                                new RawSourceWaveStream(msAudio , waveFormat))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.Play();
                    while (waveOut.PlaybackState == PlaybackState.Playing)
                    {
                        System.Threading.Thread.Sleep(100);
                    }
                }
            }
        }

我的问题是:

  • 我听到Toc Toc Toc噪音(大约每秒4次)
  • 音频缓慢,声音变形,比特率太低(但8khz是正确的)
  • 音频循环播放,我想我必须冲洗我的小溪,但我不明白......

非常感谢,如果你能告诉我一些建议......

P.S: 为了帮助,原始代码使用AudioTrack在Android中工作。代码是here

P.S 2:这里"图像"我有的音频噪音: RawAudio

1 个答案:

答案 0 :(得分:0)

我不想回应自己..但我认为我的问题太具体了...... 所以我解决了我的问题:

  • 使用BufferedWaveProvider代替memoryStream
  • 加倍SampleRate(16KHz)
  • 删除缓冲区的前4个字节

现在我的代码看起来像:

    public ctor()
    {            
        var waveFormat = new WaveFormat(16000, 16, 1);
        buffer = new BufferedWaveProvider(waveFormat)
        {
            BufferDuration = TimeSpan.FromSeconds(10),
            DiscardOnBufferOverflow = true
        };
    }

    internal void OnDataReceived(byte[] currentFrame)
    {
        if (mPlaying && mAudioTrack != null)
        {               
            buffer.AddSamples(currentFrame, 4, currentFrame.Length);
        }
    }

    internal void ConfigureCodec()
    {                   
        mAudioTrack = new WaveOut(WaveCallbackInfo.FunctionCallback());
        mAudioTrack.Init(buffer);
        if (mPlaying)
        {
            mAudioTrack.Play();
        }            
    }

没有线程......