Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用HTML5/javascript纠正音频音量输出分贝,关闭预处理_Javascript_Ios_Html_Audio_Volume - Fatal编程技术网

使用HTML5/javascript纠正音频音量输出分贝,关闭预处理

使用HTML5/javascript纠正音频音量输出分贝,关闭预处理,javascript,ios,html,audio,volume,Javascript,Ios,Html,Audio,Volume,我们观察到,在许多系统中,使用浏览器中基于javascript的音频时,输出电平与输入信号电平并不是正确的线性比例。例如,如果“播放”两个振幅变化为20dB的正弦波,则不同设备/设置产生的差值可能与20dB明显不同,例如,相差10dB或更小。 我们需要将简单的音频信号(例如,正弦波)输出到彼此相关的校准分贝级,例如,在一个音量上输出一个正弦波,然后输出另一个比第一个低20分贝的正弦波,并让它们以这种方式输出。 我们希望通过使用HTML5/javascript的浏览器执行此操作。 我们尝试了几种方

我们观察到,在许多系统中,使用浏览器中基于javascript的音频时,输出电平与输入信号电平并不是正确的线性比例。例如,如果“播放”两个振幅变化为20dB的正弦波,则不同设备/设置产生的差值可能与20dB明显不同,例如,相差10dB或更小。 我们需要将简单的音频信号(例如,正弦波)输出到彼此相关的校准分贝级,例如,在一个音量上输出一个正弦波,然后输出另一个比第一个低20分贝的正弦波,并让它们以这种方式输出。 我们希望通过使用HTML5/javascript的浏览器执行此操作。
我们尝试了几种方法,例如使用预先创建、校准的.mp3文件,直接使用Web音频API生成具有校准dB电平的振荡器。我们得到了(给我们的)非常令人惊讶且基本上不正确的结果。 当我们使用校准过的麦克风测量设备发出的声音时,我们观察到了各种奇怪的现象,这表明音频不仅仅是以线性方式“播放”,而是在实际输出之前对其进行了复杂的预处理。这似乎取决于目前我们无法控制的各种变量。它的工作方式与“普通”音频放大器的工作方式不同,即无论绝对电平设置为什么,20dB的声音输入都会产生20dB的声音输出。 我们发现,使用相同的javascript代码会产生非常不同的结果,这取决于各种变量,包括硬件(例如,在Mac和iPhone上浏览)、所选的音量设置(即使音量为1/2时输入的20dB差异的相对值不相差20dB)、是否使用耳机等

在进一步的测试中,主要问题似乎与外部扬声器的使用有关。使用耳机时,效果会更好

基本问题是,如果您创建两个不同的信号,其音量差异已知,例如20dB,并以几种方式中的任何一种将它们都输出,则测量的差异通常不会达到20dB,在某些情况下甚至会达到10dB

是否有某种方法可以通过编程实现这一点

是否有方法覆盖任何预处理或音频音量压缩似乎在调整音量(导致输出与输入不正确成比例)

我们需要一种跨平台(桌面、iOS、Android、不同浏览器、不同耳机/扬声器)的方法来实现这一点,因此需要使用HTML5

如果使用HTML5无法做到这一点,那么我们如何使用本机iOS/Android代码呢?这似乎更多的是硬件问题而不是软件问题,但也许有办法克服它


谢谢

我们通过深入研究回答了这个问题。 经过详细测试后,以下内容变得清晰: 1) 在所有测试系统上,使用耳机时,无论其他设置如何,声音振幅输出几乎与输入完全成1:1的线性关系。在多个浏览器、多个设备、iOS、Android、OSX、多电源和无电源耳塞以及入耳式耳机上都是如此。 2) 在许多系统/设置/音量级别中,使用外部扬声器时,声幅输出与输入之间的线性关系不是1:1。相反,声音通常是线性的,斜率小于1,通常明显小于1(例如1/2)。除此之外,许多系统在较高的体积水平下也会饱和。这似乎是因为外部扬声器使用了补偿机制


因此,正确的答案是:只要使用耳机,HTML5/javascript音频生成的音频输出振幅与输入几乎是1:1线性。在许多常用设备上使用外置扬声器时,其与输入的线性比不接近1:1。

许多声卡和操作系统级驱动程序会增强静音,使输出更稳定,因此,即使使用声音播放应用程序而不是web,也会出现此“问题”。您必须调整操作系统提供的声音属性(如果可用)。还请记住,很少有扬声器具有平坦的线性效率,而且感知DBs需要10倍的瓦特。不过,您可以在校准方面做得更好一些;可能使用设备的麦克风对不同的输出进行采样和补偿。这会通过话筒响应曲线带来更多的不规则性,但总比什么都没有好。看起来,确保扬声器发出的声音相差20分贝的唯一方法是使用话筒进行反馈回路,这仍然远远不够完美。