发布网友 发布时间:2022-04-20 08:19
共2个回答
热心网友 时间:2023-08-14 13:38
A Waveout 是在32位的Windows上的一种老旧且过时,用来播放数字音讯的应用程序接 口(Application
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 = 'http://static.pay.baidu.com/resource/chuan/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, AWE 和其它类似的 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 更差, 即使你可能听 不出。
热心网友 时间:2023-08-14 13:38
A Waveout 是在32位的Windows上的一种老旧且过时,用来播放数字音讯的应用程序接口。
Directsound 是种较新、较现代化的声音播放 API,都已经内建在最近的32位Windows操作系统中。
1、DirectSound是DirectXAudio的一个较底层的部件,提供了丰富的接口函数,实现.wav格式的波形声音数据的播放控制。
2、创建对象:要取得次缓冲区,首先需要创建一个IDirectSound8接口对象。为此,调用DirectXAPI函数提供的DirectSoundCreate8进行创建。该函数用到DSound.h和Dsound.lib文件,如下是它的使用原型。
3、协调级别:IDirectSound声卡设备创建出来以后,需要调用DirectXAPI函数SetCooperativeLevel,进一步设置设备的协调级别,以决定声卡设备以哪种方式与Windows其他程序分享。