2014-02-16 105 views
1

我正在使用WinAPI - Wave函數來創建錄製程序,將麥克風錄製X秒。我在網上搜索了一下,發現PCM數據太大,並且通過套接字發送它會成爲問題...壓縮PCM數據

如何將它壓縮到更小的東西?任何簡單/「便宜」的方式?

我也注意到,當我用波動API函數聲明的格式,我使用這個代碼:

WAVEFORMATEX pFormat; 
pFormat.wFormatTag= WAVE_FORMAT_PCM;  // simple, uncompressed format 
pFormat.nChannels=1;     // 1=mono, 2=stereo 
pFormat.nSamplesPerSec=sampleRate;  // 44100 
pFormat.nAvgBytesPerSec=sampleRate*2; // = nSamplesPerSec * n.Channels * wBitsPerSample/8 
pFormat.nBlockAlign=2;     // = n.Channels * wBitsPerSample/8 
pFormat.wBitsPerSample=16;    // 16 for high quality, 8 for telephone-grade 
pFormat.cbSize=0; 

正如你所看到的,pFormat.wFormatTag= WAVE_FORMAT_PCM; 也許我可以插入,而不是WAVE_FORMAT_PCM別的東西,所以它會馬上被壓縮? 我已經檢查了其他值的MSDN,但它們都不適用於我的Visual Studio ...

那麼,我該怎麼做?

謝謝!

+1

wFormat標籤描述數據。改變它不會改變數據,它只會導致它解釋錯誤。您需要的是一個編碼器,它將採用PCM並輸出壓縮格式,如ADPCM或Vorbis。 – AShelly

+0

你需要一個編解碼器。你需要什麼編解碼器?這取決於你的約束。你正在錄製語音或音樂還是別的什麼?您是否編碼了一個可以無損下載或編碼實時流的文件?如果是實時的,你的帶寬是多少?一旦你回答了這些問題,你可以選擇一個編解碼器。 – arx

+0

@arx我試圖寫一個小型的IP語音程序 – Amit

回答

3

最簡單的方法是簡單地從44100降低採樣率的東西更容易管理的像22050,16000,11025,或甚至8000大多數語音編解碼器不走無論如何,高於16000赫茲。而較舊的則針對8khz進行了優化。

下一步是找到一個編解碼器。有一些編解碼器可以與Windows Audio Compression Manager一起使用,但幾乎所有這些編解碼器都可以追溯到Windows 95,並且在解壓縮之後按照現代標準聽起來很糟糕。您可以使用Format SDK或Media Foundation API實時轉換爲WMA。或者去一個開源的MP3庫,如LAME

+0

由於數組現在是24,000的長度,壓縮它仍然很重要嗎? – Amit

+0

@Amit - 這實際上是你的電話。你從來沒有提到你的音頻數據塊有多大,性能要求或者既定的目標。所以如果你對演出感到滿意,那麼你就全部定下來了。否則,繼續探索更多選擇。 – selbie

1

對於電話質量的語音,您可以將每個樣本更改爲8位,採樣率爲8000.這將大大減少數據量。

+0

謝謝!數組大小現在是24,000的大小。 VOIP的速度足夠小嗎?或者我應該壓縮它呢? – Amit

+0

@Amit:VOIP的挑戰不是你的平均數據速率;當數據包丟失**和**時,確保你得到合理的東西,同時保持延遲。 – MSalters

+0

@MSalters我可以用線程做到這一點,通過線程來接收數據,並通過線程播放數據..多數民衆贊成在你的意思,不是? – Amit