希望你能提供幫助。我從麥克風錄製音頻並通過網絡實時流式傳輸。樣品的質量是11025hz,8位,單聲道。雖然有一個小的延遲(1秒),但效果很好。我需要幫助的是我正在嘗試實施降噪和壓縮,以使音頻更安靜並使用更少的帶寬。音頻採樣存儲在一個C#數組字節[]中,我使用Socket發送/接收數據。流式音頻中的降噪和壓縮
任何人都可以建議如何在C#中實現壓縮和降噪?我不介意使用第三方庫,只要它是免費的(LGPL許可證等),並且可以在C#中使用。但是,我更喜歡實際的工作源代碼示例。預先感謝您提供的任何建議。
UPDATE:
我改變比特大小從8位音頻到16位音頻和噪聲問題是固定的。顯然,來自麥克風的8位音頻信噪比太低。語音在11khz,16位單聲道聽起來很棒。
但是,自從我發佈這個項目以來,這個項目的需求已經發生了變化。我們現在也在嘗試添加視頻。我有一個回調設置,每隔100毫秒從網絡攝像頭接收實時圖像。我需要對音頻和視頻進行編碼,將它們複用,將它們在我的套接字上傳輸到服務器,服務器將該流重新傳輸到另一個客戶端,該客戶端接收流,將流解複用並解碼音頻和視頻,視頻輸入到圖片框中並將音頻輸出到揚聲器。
我在尋找ffmpeg來幫助(de | en)編碼/ [de] muxing,並且我也將SharpFFmpeg看作ffmpeg的C#互操作庫。
我找不到任何這樣做的好例子。我整週都在互聯網上搜索,沒有真正的運氣。任何幫助你可以提供非常感謝!
下面是一些代碼,包括我的回調函數的MIC錄音:
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 { } }
所以我應該在哪裏何去何從?
你的意思是哪種類型的壓縮:http://en.wikipedia.org/wiki/Audio_compression – 2010-06-10 21:10:47
請看我的更新。需要將音頻和視頻壓縮成實時流。我不知道我需要使用什麼方法。我隨着80x80(小)視頻傳輸語音。它需要在互聯網上運行良好。 – 2010-06-11 01:54:50
遵循你的鏈接,這將是音頻壓縮(數據),而不是動態範圍壓縮。需要壓縮以通過Internet進行傳輸(所有連接都將具有高速互聯網),但我們需要能夠通過流媒體服務器支持大量連接,因此帶寬非常重要。 – 2010-06-11 01:57:36