Programming Interface,簡稱API)。舊的Windows操作系統(如Win9x WinNT4)在 Wav eout 的完成度很高(因為 waveout 是針對這些操作系統設計的),如果妳想獲得最好 的效能,妳應該在這些操作系統上使用 Waveout 輸出。然而 Waveout 的功能有所局限 ,它無法支持「混和多重音訊流」的功能。這顯示在Win2kXP下的 Waveout,只是為了 舊的軟件的兼容性所提供的,也因此Win2kXP下 Waveout 的完成度很糟,它沒有使用任 何的硬件加速功能,所有的混音動作都是用軟件來執行(因此當CPU的使用率很高時,常 常會發生類似CD跳針的斷音現象)。
Directsound 是種較新、較現代化的聲音播放 API,都已經內建在最近的32位Windows操 作系統中。
Directsound 支持混和多重音訊流、獨立的音量控制、硬件加速層及硬件仿真層(如果 某些功能硬件無法支持,可以用軟件來仿真,因此程序設計師無須擔心他們的新 l33t 碼無法在舊的聲霸卡16上運作)。壹般來說,只要妳的操作系統安裝了適當的聲卡驅動 程序及最新的 DirectX,Direstsound 都應該可以運作的很好(除了WinNT4以外)。在 Win2kXP下,Directsound 比 waveout 更好,因為在這些操作系統裏,Directsound 的 完成度相對的比 waveout 來的更高(比 waveout 占用較少的CPU資源,自由度較高,且 不會有 Waveout 常見的小毛病)。Directsound 原本是被設計來讓遊戲利用系統的硬件 加速功能,而無須直接接觸低階的硬件函數(就如同 DirectX 其它的組件)。 Q 為何 Directsound 總是比 waveout 來的小聲?
A 在Win2kXP中,改變 waveout 的音量似乎會改變整體音量的設定,然而 Directsou nd 的音量是獨立控制的。換句話說,妳用 waveout 來播放音樂,妳將音量設為50%,妳 就會得到50%的音量,然後妳用 Directsound 來播放,妳將音量設為50%,妳只會得到最 大音量的25%。解決之道:別使用 waveout,並在Windows的音量控制中將音量設為最大 。
Q Directsound 及 waveout 之間的聲音輸出品質有所不同嗎? A1 在Win2kXP下(或者使用WDM驅動程序),waveout 及 Directsound 只有在傳輸 P CM 資料給 Windows kernel mixer 上有兩點不同。waveout 只使用軟件混音,因此較少 造成系統中的特殊問題,而 Dircetsound可以使用硬件混音,因此會造成某些已知的, 聲音品質的問題。
A2 在Win9x下,Directsound 驅動系統完全的與 waveout 分離,並使用低階的方式來 控制硬件,因此這就像拿兩種不同的驅動程序來配合 waveout 及 Directsound。在使用 某些老舊的ISA接口的聲卡時,Directsound 為了節省 ISA 總線的頻寬,有著會將音訊 資料降低取樣率至 22khz 8bit (或者其它相近的取樣率)的問題。 Q 對於 Directsound 而言,軟件混音及硬件混音有何不同?
A 在 WinXP sp1、DirectX 8.1 中,無論是使用微軟的 Directsound 核心或者是驅動 程序來進行硬件混音,都很容易碰到問題。目前已經證實,在 Winxp 下使用硬件混音來 傳輸音訊資料時,即使是使用不同的聲卡,皆會碰上「取樣頻率」的問題。特別是某些 驅動程序存在已久的問題(著名的創新未來 Audigy 聲卡 Skipping 問題,在某些設定 中會出現不間斷、靜態的雜音,甚至在某些例子中,會發生聲音品質驟降的情形,天曉 得為何會如此!)。如果妳想穩定的運作計算機,那建議妳最好把硬件加速給關掉。硬
件混音可以 foobar2000 的偏好設定中的 Driectsound 這個字段裏找到 "allow
var script = document.createElement('script'); script.src = '/resource/baichuan/ns.js'; document.body.appendChild(script);
void function(e,t){for(var n=t.getElementsByTagName("img"),a=+new Date,i=[],o=function(){this.removeEventListener&&this.removeEventListener("load",o,!1),i.push({img:this,time:+new Date})},s=0;s< n.length;s++)!function(){var e=n[s];e.addEventListener?!e.complete&&e.addEventListener("load",o,!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){"complete"==e.readyState&&o.call(e,o)})}();alog("speed.set",{fsItems:i,fs:a})}(window,document);
hardw
are acceleration"。開啟它不代表妳就真的激活了這個功能(Directsound 會在沒有可
用資源時自動使用軟件混音)。 關於重新取樣(resampling)
Q 如果我使用重新取樣的功能,能夠增進(improve)聲音的品質嗎?
A 不行,妳無法利用重新取樣來「增進」聲音的品質,重新取樣是個有耗損的過程。妳 可以試看看改變壹張 bmp 圖片的大小,改過大小的圖片會和原本的圖片極為相似,不過 假如妳把兩張圖都放大(zoom-in)來看,妳會發現它們在細節上並不相同。在某些硬件上 ,如果妳使用高品質的重新取樣軟件,來避免讓妳的驅動程序硬件處理重新取樣的過程 ,妳可以避免大量資料的損失(也就是避免音訊品質降低)。我知道某些人在他們的聲 霸卡16上將取樣率提升為 96khz 24bit,並且聲稱這樣能聽到較「明亮」的聲音(事實 上Windows kernel mixer會將取樣率降回 44khz 16bit),別聽他們所說的話。 Q 我應該將重新取樣的參數設為多少比較好?
A 首先,妳應該查詢妳聲卡的硬件資料。某些聲卡(例:在 Awesome系列以前發售的 聲霸卡)不需要重新取樣,這表示妳不需要額外的重新取樣就已經得到最好的品質了( 不會有重新取樣造成的品質降低)。所有的 Live!系列Audigy系列AC97兼容的聲卡 ,都已經將輸出的取樣頻率固定為 48khz,重新取樣的品質會因為驅動程序硬件裝置 Windows混音設定而改變。在許多例子中,SSRC重新取樣軟件會優先於妳的硬件驅動程 序,因此妳需要將重新取樣的參數設為 48khz16bits,以避免妳的硬件驅動程序來進 行它們較差的重新取樣。
Q 但是我在我的聲霸卡上可以重新取樣為 96khz24bits ...
A 當然可以,Windows混音器會將取樣率降回妳硬件能夠接受的格式(例如: 48khz1 6bits),這會造成額外的品質降低。不要提升取樣率,除非妳的硬件真的能夠接受這些 格式。 Dithering
dither 在計算機繪圖上稱為「遞色」,而在處理音訊上,也有著相似的意思。以下有三 張圖,大家可以看看 dither 的差異在何處。 原始的圖(24bit 高彩),左上角的小方塊是從黑框中放大的。 有 dither 的圖(8bit 256色),較遠處看可以說看不出與原圖的差異。 無 dither 的圖(8bit 256色),色彩的分布不平順,與原圖可以看出根本的差異。(圖 略)
啟用這個功能,將會在播放波形時Dithering。如果dithering沒有激活,那麽foobar20 00將會改用切平。這意指沒有用到的位會被砍掉並丟棄。在許多較安靜的音樂中有淡入 或淡出的情況時,會造成「斷裂」的聽覺效果(也就是淡入出的效果不平順)。
Dithering只有在妳將高位(例如:32bit)的音訊以低位(例如:16bit)來播放時才真 正有用。
輸出位設定(Output bit depth)
這裏有個下拉式選單,可以讓妳選擇輸出的位率。如果妳有張 24bit 的聲卡,妳當然會 想讓那些沒有用到的位使用 dither to 24bit 來輸出。即使是 16bit 的聲卡,在播放 32bit 的音訊時使用 dither to 16bit 也能增進音質。 foobar2000 處理音訊資料的管道如下
decoder(32 bit fp)=>[replaygain]=>[DSP]=>downsample to 1624 bit with option
var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;
al dithering
因此當妳選擇 dither to 1624bit 時,建議妳激活dithering。然而如果設為 32bit 是不需要激活dithering,因為從譯碼器直接傳送過來的資料就是 32bit。 關於 Kernel Streaming
Q 何謂 Kernel Streaming ?
A Kernel Streaming 會繞過 Windows kernel mixer,直接輸出音訊資料給聲卡。這種 方式有著較低的輸出延遲,也許可以被視為 ASIO output 之外的另壹種選擇。 Q 我應該用 Kernel Streaming 嗎?
A 如果妳的聲卡及驅動程序能支持,且妳使用 Kernel Streaming 沒有什麽問題的情況 下,我會建議妳使用Kernel Streaming 。 Q 為何使用 Kernel Streaming 來輸出,比使用 Directsound 輸出,感覺聲音變的更大聲或者明亮?
A 聲音並沒有變的明亮,只有變大聲。因為輸出資料給聲卡的方式不同,因為繞過了 Windows 的混音器
,音量控制(wave)對於 Kernel Streaming 是無效的,而且都以最大音量來輸出。如果 妳將音量控制中的 wave 音量設為最大,並使用 Directsound 輸出,妳會發現音質和 Kernel Streaming 輸出沒什麽不同。
Q 哪些操作系統可以使用 Kernel Streaming ?
A Kernel Streaming 只能在 Windows 2000 及 Windows XP 上運作,有人說應該可以 在Windows ME 上運作。 如何設置
壹打開 foobar2000, 妳會發現它連 play, stop 這些基本的按鈕都沒有, 妳可以到 Fo obar2000>Preferences>Display 裏, 選 Show buttons, 接著到 DSP Manager, 把右邊
的 Resampler 移到左邊, 然後在 DSP Manager 下的 Resampler 裏, 把 Target sampl e rate 設定成妳 soundcard 本身的 sample
rate 以下是壹些建議數值 (參考自 DearHoney 的 RMAA 數據庫) 44100 - 16, AWE32, AWE64 和其它類似的 ISA soundcard
48000 - PCI, Live, Audigy1, Audigy2, Extigy, Philips AE, Sonic Fury, Ya maha 7x4 和壹般的 onboard soundcard
96000 - Audigy2 和壹些真正支持 96khz 的 soundcard, 例如 Terratec 的
在使用 Resampler 之後, 再試試播放上面提及的兩個測試訊號, 聽聽是否只聽到很純很 尖的超高頻聲音, 而且聽不出兩個檔案的分別。如果是的話, 高質素的 src 已經成功了 。否則請到 foobar2000>preferences>Output 裏, 試試選用不同的 Output, 如 Kerne
l Streaming (只限 WDM driver), 變更 DirectSoundWaveOut 裏的各種設定再試試看
, 如果仍然失敗的話, 試試在 Windows 音量控制裏按選項>進階控制, 看看是否有高低 音控制, 如果有的話, 把高低音都移到正中間再試試看 (如果本身已經在中間就不用移 了), 如果還是不行的話, 我也無話可說。註意使用 Kernel Streaming 時 Windows 音 量控制裏的 wave 輸出可能會無法控制, 那是正常的現象。
接著到 Playback 壹欄, 會有壹個 Output bit depth 的選項, 只有 soundcard 真正支 持 24-bit 時才選擇 24-bit (Audigy1 是 16-bit, Audigy2 才是 24-bit), 因為在不 支持 24-bit 的 soundcard 上選 24-bit 只會令音質比 16-bit 更差, 即使妳可能聽 不出。