流式音频中的降噪和压缩

Posted

技术标签:

【中文标题】流式音频中的降噪和压缩【英文标题】:Noise reduction and compression in streaming audio 【发布时间】:2011-03-01 08:21:22 【问题描述】:

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

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

更新:

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

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

我正在寻找 ffmpeg 以帮助进行 (de|en)coding/[de]muxing,我还将 SharpFFmpeg 视为 ffmpeg 的 C# 互操作库。

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

这是一些代码,包括我的麦克风录音回调函数:

私有常量 int AUDIO_FREQ = 11025; 私人 const int CHANNELS = 1; 私有常量 int BITS = 16; 私有常量 int BYTES_PER_SEC = AUDIO_FREQ * CHANNELS * (BITS / 8); 私有常量 int BLOCKS_PER_SEC = 40; 私有常量 int BUFFER_SECS = 1; 私有常量 int BUF_SIZE = ((int)(BYTES_PER_SEC / BLOCKS_PER_SEC * BUFFER_SECS / 2)) * 2; // 四舍五入到最接近的偶数 私人 WaveLib.WaveOutPlayer m_Player; 私有 WaveLib.WaveInRecorder m_Recorder; 私有 WaveLib.FifoStream m_Fifo; 网络摄像头我的网络摄像头; 公共无效 OnPickupHeadset() 停止铃声(); 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, 新 WaveLib.BufferFillEventHandler(PlayerCB)); m_Recorder = new WaveLib.WaveInRecorder(-1, fmt, BUF_SIZE, BLOCKS_PER_SEC, 新 WaveLib.BufferDoneEventHandler(RecorderCB)); 我的网络摄像头 = null; 尝试 MyWebCam = new WebCam(); MyWebCam.InitializeWebCam(ref pbMyPhoto, pbPhoto.Width, pbPhoto.Height); MyWebCam.Start(); 抓住 私有字节[] m_PlayBuffer; 私人无效 PlayerCB(IntPtr 数据,int 大小) 尝试 if (m_PlayBuffer == null || m_PlayBuffer.Length != 大小) m_PlayBuffer = 新字节[大小]; 如果(m_Fifo.Length >= 大小) m_Fifo.Read(m_PlayBuffer, 0, size); 别的 // 阅读我们可以阅读的内容 int fifoLength = (int)m_Fifo.Length; m_Fifo.Read(m_PlayBuffer, 0, fifoLength); // 将缓冲区的其余部分归零 for (int i = fifoLength; i

那么我应该从这里去哪里?

【问题讨论】:

你指的是哪种压缩方式:en.wikipedia.org/wiki/Audio_compression 请看我的更新。需要将音频和视频压缩成实时流。我不知道我需要使用什么方法。我正在传输语音和 80x80(小)视频。它需要在 Internet 上运行良好。 按照您的链接,这将是音频压缩(数据),而不是动态范围压缩。需要压缩以通过 Internet 传输(所有连接都将具有高速 Internet),但我们需要能够通过我们的流媒体服务器支持大量连接,因此带宽很重要。 嗨@RodneyBurton,我正在尝试做一些与您非常相似的事情,但在android上。我设法通过 wifi 接到语音电话,但我也有延迟。这个滞后基本上是通过缓冲量增加/减少的。我不能减少太多的缓冲区,因为手机不能这么快地处理它。好的。我还考虑过压缩音频。我试过没有成功(在android上很难做到)。但我也在想,值得吗?为了减少延迟?我的意思是,我们将尝试压缩对话的一个非常小的样本,它会压缩吗?你怎么看? 【参考方案1】:

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

如果您继续以该速率录制和流式传输,您将会听到嘈杂的音频 - 期间。消除(或实际上只是衰减)这种噪声的唯一方法是将音频上采样到 44100Hz/16 位,然后对其执行某种降噪算法。这种上采样必须由客户端应用程序执行,因为在流式传输之前在服务器上执行此操作意味着您将流式传输比原始音频大 8 倍的音频(在服务器上执行此操作也完全没有意义,因为您会最好首先以更密集的格式录制)。

您要做的是以 CD 质量格式录制您的原始音频,然后将其压缩为 MP3 或 Ogg Vorbis 等标准格式。请参阅这个较早的问题:

What's the best audio compression library for .NET?

更新:我没用过,但是:

http://www.ohloh.net/p/OggVorbisDecoder

我认为您需要一个编码器,但我找不到用于 Ogg Vorbis 的编码器。我认为您也可以尝试编码为 WMV 格式:

http://www.discussweb.com/c-programming/1728-encoding-wmv-file-c-net.html

更新 2: 抱歉,我的流媒体知识水平很低。如果我正在做你正在做的事情,我会首先从音频和静止图像创建一个(未压缩的)AVI文件(通过PInvoke使用avifil32.dll方法),然后将其压缩为MPEG(或任何标准格式) - YouTube 有一个页面,他们可以在其中讨论他们的首选格式,使用其中一种格式可能会很好)。

我不确定这是否能满足您的需要,但这个链接:

http://csharpmagics.blogspot.com/

使用这个免费播放器:

http://www.videolan.org/

可能会起作用。

【讨论】:

感谢您的回答。以更高的质量进行采样然后进行压缩是有意义的。我下载了 libogg 和 libvorbis 的源代码并编译了它们,所以我有了 DLL。但我不知道如何在我的 C# 应用程序中使用它们。您能否指出一个使用 C# 的 [DllImport] 对我的实时音频流缓冲区进行编码/解码的示例? 我也找不到 C# Ogg 编码器。如果我走 Ogg 路线,我将需要一个可以编码和解码 Ogg Vorbis 和 Theora 的 C# 解决方案,因为我现在正在做音频 + 视频。艰难的命令,嗯? 如果您正在制作音频视频,我想说不要担心音频是一个单独的东西。使用对音频和视频进行编码/解码的东西(几乎是所有东西,包括 MPEG、WMV 等)。 一些我需要帮助的问题:你会使用什么音频编解码器?什么视频编解码器?什么文件格式?您会使用哪些第三方库?这些库有哪些 C# 包装器?您会调用这些库中的哪些函数来进行直播? 只是为了解决这个问题,这就是我最终要做的。我们说暂时忘记视频。我们稍后会添加(无论如何,两个新闻稿都比 1 个好!)。我们使用 NAudio 来捕获音频,因为发现它比使用的 waveIn/waveOut 更稳定。这在 Vista 中释放非托管缓冲区和间歇性崩溃时存在问题。 NAudio 没有崩溃!就最初的问题而言,将位大小从 8 位更改为 16 位可以修复 b/g 噪声。我们仍在考虑实施 Speex 编解码器(因为它是免费的,没有专利限制)。感谢大家的帮助!【参考方案2】:

如果您只想压缩数据以限制带宽使用,您可以尝试使用 GZipStream。

【讨论】:

因为我们也要做视频(现在),所以我宁愿使用专为 AV 设计的东西,而不是通用的压缩技术。此外,我需要一种方法将音频和视频复用/解复用为 1 个流,通过 1 个网络套接字发送。 我担心 android 在多媒体方面的装备有些欠佳 :)

以上是关于流式音频中的降噪和压缩的主要内容,如果未能解决你的问题,请参考以下文章

怎么给录音降噪处理

三维声技术在赛事直播中的应用,TWS耳机中音频技术落地实践,通话降噪算法落地应用及挑战...

QCC514X蓝牙音频片上系统引入自适应主动降噪技术

QCC514X蓝牙音频片上系统引入自适应主动降噪技术

camera数字降噪(DNR)

如何给音频降噪