Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流媒体音频中的降噪与压缩_C#_Compression_Wav_Audio Streaming_Noise Reduction - Fatal编程技术网

C# 流媒体音频中的降噪与压缩

C# 流媒体音频中的降噪与压缩,c#,compression,wav,audio-streaming,noise-reduction,C#,Compression,Wav,Audio Streaming,Noise Reduction,希望你能帮忙。我正在用麦克风录制音频,并通过网络实时播放。样品质量为11025hz,8位,单声道。虽然有一个很小的延迟(1秒),但效果很好。我需要帮助的是,我现在正在尝试实施降噪和压缩,使音频更安静,使用更少的带宽。音频样本存储在字节[]的C#数组中,我使用套接字发送/接收该数组 有人能建议如何在C#中实现压缩和降噪吗?我不介意使用第三方库,只要它是免费的(LGPL许可证等),并且可以从C#使用。然而,我更喜欢实际工作的源代码示例。提前感谢您提出的任何建议 更新: 我将位大小从8位音频更改为16

希望你能帮忙。我正在用麦克风录制音频,并通过网络实时播放。样品质量为11025hz,8位,单声道。虽然有一个很小的延迟(1秒),但效果很好。我需要帮助的是,我现在正在尝试实施降噪和压缩,使音频更安静,使用更少的带宽。音频样本存储在字节[]的C#数组中,我使用套接字发送/接收该数组

有人能建议如何在C#中实现压缩和降噪吗?我不介意使用第三方库,只要它是免费的(LGPL许可证等),并且可以从C#使用。然而,我更喜欢实际工作的源代码示例。提前感谢您提出的任何建议

更新:

我将位大小从8位音频更改为16位音频,并且解决了噪音问题。显然,来自麦克风的8位音频的信噪比太低。在11khz、16位单声道条件下,声音听起来很棒

然而,自从我发布了这篇文章以来,这个项目的需求已经发生了变化。我们现在也在尝试添加视频。我有一个回调设置,每100毫秒从网络摄像头接收一次实时图像。我需要对音频和视频进行编码,多路复用,在我的套接字上将它们传输到服务器,服务器将流重新传输到另一个客户端,该客户端接收流,对流进行解复用并解码音频和视频,在图片框中显示视频,并将音频输出到扬声器

我正在研究ffmpeg以帮助进行(de | en)编码/[de]muxing,我还将SharpFFmpeg作为ffmpeg的一个C互操作库

我找不到任何这样做的好例子。我整个星期都在网上搜索,没有真正的运气。非常感谢您提供的任何帮助

以下是一些代码,包括我的麦克风录音回拨功能:

private const int AUDIO_FREQ = 11025; private const int CHANNELS = 1; private const int BITS = 16; private const int BYTES_PER_SEC = AUDIO_FREQ * CHANNELS * (BITS / 8); private const int BLOCKS_PER_SEC = 40; private const int BUFFER_SECS = 1; private const int BUF_SIZE = ((int)(BYTES_PER_SEC / BLOCKS_PER_SEC * BUFFER_SECS / 2)) * 2; // rounded to nearest EVEN number private WaveLib.WaveOutPlayer m_Player; private WaveLib.WaveInRecorder m_Recorder; private WaveLib.FifoStream m_Fifo; WebCam MyWebCam; public void OnPickupHeadset() { stopRingTone(); m_Fifo = new WaveLib.FifoStream(); WaveLib.WaveFormat fmt = new WaveLib.WaveFormat(AUDIO_FREQ, BITS, CHANNELS); m_Player = new WaveLib.WaveOutPlayer(-1, fmt, BUF_SIZE, BLOCKS_PER_SEC, new WaveLib.BufferFillEventHandler(PlayerCB)); m_Recorder = new WaveLib.WaveInRecorder(-1, fmt, BUF_SIZE, BLOCKS_PER_SEC, new WaveLib.BufferDoneEventHandler(RecorderCB)); MyWebCam = null; try { MyWebCam = new WebCam(); MyWebCam.InitializeWebCam(ref pbMyPhoto, pbPhoto.Width, pbPhoto.Height); MyWebCam.Start(); } catch { } } private byte[] m_PlayBuffer; private void PlayerCB(IntPtr data, int size) { try { if (m_PlayBuffer == null || m_PlayBuffer.Length != size) m_PlayBuffer = new byte[size]; if (m_Fifo.Length >= size) { m_Fifo.Read(m_PlayBuffer, 0, size); } else { // Read what we can int fifoLength = (int)m_Fifo.Length; m_Fifo.Read(m_PlayBuffer, 0, fifoLength); // Zero out rest of buffer for (int i = fifoLength; i < m_PlayBuffer.Length; i++) m_PlayBuffer[i] = 0; } // Return the play buffer Marshal.Copy(m_PlayBuffer, 0, data, size); } catch { } } private byte[] m_RecBuffer; private void RecorderCB(IntPtr data, int size) { try { if (m_RecBuffer == null || m_RecBuffer.Length != size) m_RecBuffer = new byte[size]; Marshal.Copy(data, m_RecBuffer, 0, size); // HERE'S WHERE I WOULD ENCODE THE AUDIO IF I KNEW HOW // Send data to server if (theForm.CallClient != null) { SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.SetBuffer(m_RecBuffer, 0, m_RecBuffer.Length); theForm.CallClient.SendAsync(args); } } catch { } } //Called from network stack when data received from server (other client) public void PlayBuffer(byte[] buffer, int length) { try { //HERE'S WHERE I WOULD DECODE THE AUDIO IF I KNEW HOW m_Fifo.Write(buffer, 0, length); } catch { } } 私人常数int AUDIO_FREQ=11025; 专用const int通道=1; 私有常量int位=16; 私有常量int字节/秒=音频*频道*(位/8); 私用常数整块每秒=40; 私有常量int BUFFER_SECS=1; private const int BUF_SIZE=((int)(字节/秒/块/秒*缓冲区/秒/2))*2;//四舍五入到最接近的偶数 私人WaveLib.WaveOutPlayer m_播放器; 专用WaveLib.WaveInRecorder m_记录器; 私有WaveLib.FifoStream m_Fifo; 网络摄像头; ADSET上的公共无效() { 停止铃声(); m_Fifo=新的WaveLib.FifoStream(); WaveLib.WaveFormat fmt=新的WaveLib.WaveFormat(音频、位、通道); m_Player=新的WaveLib.WaveOutPlayer(-1,fmt,BUF_大小,每秒块数, 新的WaveLib.BufferFillEventHandler(PlayerCB)); m_Recorder=新的WaveLib.WaveInRecorder(-1,fmt,BUF_大小,块数/秒, 新的WaveLib.BufferDoneEventHandler(RecorderCB)); MyWebCam=null; 尝试 { MyWebCam=新的WebCam(); MyWebCam.InitializeWebCam(参考pbMyPhoto,pbPhoto.Width,pbPhoto.Height); MyWebCam.Start(); } 捕获{} } 专用字节[]m_播放缓冲区; 专用void播放器CB(IntPtr数据,int大小) { 尝试 { if(m_PlayBuffer==null | | m_PlayBuffer.Length!=size) m_PlayBuffer=新字节[大小]; 如果(m_Fifo.Length>=尺寸) { m_Fifo.Read(m_播放缓冲区,0,大小); } 其他的 { //尽我们所能阅读 int fifoLength=(int)m_Fifo.Length; m_Fifo.Read(m_PlayBuffer,0,fifoLength); //将剩余缓冲区归零 for(int i=fifoLength;i那么我应该从这里走到哪里呢?

你在这里的目标是相互排斥的。您的11025Hz/8bit/Mono WAV文件声音嘈杂(带有大量“嘶嘶声”)的原因是其采样率和位分辨率较低(44100Hz/16bit/立体声是CD质量音频的标准)

如果你继续以这个速率录音和流媒体,你将会有嘈杂的音频周期。消除(或实际上只是衰减)这种噪声的唯一方法是将音频采样到44100Hz/16位,然后对其执行某种降噪算法。这种上采样