【问题标题】:Javascript getChannelData some out of boundsJavascript getChannelData 一些越界
【发布时间】:2018-07-10 23:01:39
【问题描述】:

当我执行 audioBuffer.getChannelData 时,我期待一个 Float32Array,其中所有元素都在 -1 和 1 之间。但对于某些文件,某些元素高达 1.018

根据网络文档,它“需要在 [-1.0; 1.0]”https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer/getChannelData

这破坏了我的压缩算法,我想知道为什么会发生这种情况,以及将所有元素限制在 -1 和 1 之间是否安全。或者对于某些音频文件来说,它是否会超出范围?

这是一个我没有创建的 mp3 示例。 http://curtastic.com/testdecode.html

<html>
    <body>
        <script>
            var AudioContext = window.AudioContext || window.webkitAudioContext
            var gaudiocontext = new AudioContext()

            var ajax = new XMLHttpRequest()
            ajax.open("GET", 'nightmare.mp3', true)
            ajax.responseType = "arraybuffer"
            ajax.onload = function()
            {
                gaudiocontext.decodeAudioData(
                    ajax.response,
                    function(buffer)
                    {
                        console.log(buffer)
                        var a = buffer.getChannelData(0)
                        for(var i=0; i<a.length; i++)
                        {
                            var v = a[i]
                            if(v > 1 || v < -1)
                            {
                                document.write(i+": "+v+"<br>")
                                console.log(i, v)
                            }
                        }
                    }
                )
            }
            ajax.send()

        </script>
    </body>
</html>

我的 chrome 和 firefox 上的结果

275074: -1.0023564100265503
275298: 1.0011343955993652
390369: -1.0034352540969849
406446: 1.0043694972991943
406966: 1.001240611076355
464391: -1.0022114515304565
473795: -1.0013331174850464
473796: -1.0011906623840332
489287: 1.0000232458114624
489288: 1.0015380382537842
505246: 1.0035203695297241
538104: 1.0000414848327637
538105: 1.0010102987289429
538654: 1.0025116205215454
669162: 1.0007333755493164
669163: 1.0028942823410034
768849: -1.0007946491241455
777504: -1.007991909980774
801369: 1.008617639541626
869400: 1.0121995210647583
870947: 1.0112541913986206
1040100: 1.0010311603546143
1040104: 1.0021687746047974
1065010: -1.0000600814819336
1067414: -1.0003679990768433
1133228: -1.002819299697876
1133230: -1.0011301040649414
1195266: 1.0021108388900757
1195496: -1.000971794128418
1262475: -1.0009863376617432
1262744: 1.001728892326355
1262854: 1.005579948425293
1266068: -1.0022647380828857
1270317: -1.0008227825164795
1270322: -1.0015367269515991
1279046: -1.0031969547271729
1279070: -1.0004109144210815
1279080: -1.0048373937606812
1279233: 1.0006334781646729
1281418: -1.0135412216186523
1283600: -1.010787010192871
1285748: 1.0044399499893188
1288197: 1.0003455877304077
1294381: 1.0324506759643555
1294399: 1.0016738176345825
1295138: 1.0029387474060059
1295170: 1.0082039833068848
1295417: -1.0360995531082153
1295447: -1.0007649660110474
1295448: -1.0020323991775513
1295451: -1.0009381771087646
1295488: -1.0024218559265137
1295511: -1.0012314319610596
1296859: 1.0096046924591064
1299037: 1.0260592699050903
1299277: 1.005500078201294
1299449: -1.0101513862609863
1299473: -1.0100860595703125
1299475: -1.004179835319519
1301302: -1.0012340545654297
1302846: -1.0252602100372314
1303408: 1.0005576610565186
1303409: 1.0025590658187866
1303915: 1.009533405303955
1304102: -1.0001871585845947
1304307: -1.0025089979171753
1304586: 1.0183976888656616
1304694: 1.0019795894622803
1305746: 1.018847107887268
1306249: 1.0039864778518677
1306252: 1.001012921333313
1306272: 1.0042804479599
1306431: -1.0356990098953247
1306439: -1.0191256999969482
1307601: -1.0156844854354858
1310684: -1.0025532245635986
1311639: 1.020194172859192
1312099: 1.00885009765625
1312975: -1.0107345581054688
1313035: -1.0103509426116943
1313209: 1.0090372562408447
1313229: 1.014164686203003
1313473: -1.0009111166000366
1314270: -1.0130990743637085
1314990: -1.0097541809082031
1314995: -1.0220547914505005
1315724: -1.0092028379440308
1317747: -1.0046861171722412
1318425: -1.00058913230896
1318898: -1.0501095056533813
1319753: -1.0026195049285889
1319967: 1.001883864402771
1320248: -1.0159223079681396

【问题讨论】:

  • 对于该示例,我的浏览器(Linux 上的 Firefox 和 Chromium)中只记录了缓冲区对象。您使用什么平台/浏览器?
  • 哦,哇,我的 Chrome 和 Firefox 的解码方式都与你的不同。那么一定只是轻微的变化
  • Windows 10 与 Google Chrome 版本 67.0.3396.99(官方版本)(64 位)
  • 我的 Firefox Quantum 61.0.1(64 位)上的数字略有不同,但数量和变化大致相同。

标签: javascript html5-audio web-audio-api


【解决方案1】:

我能够在 Firefox for Windows 上重现它。不知道为什么你可能会得到这些超出范围的值,但spec says

任何音频的目标节点处所有音频信号的范围 图名义上是 [-1, 1]。信号值的音频再现 超出此范围,或值 NaN、正无穷大或 负无穷大,本规范未定义。

未定义意味着在这种情况下你可以做任何你喜欢的事情。夹紧似乎是一个合理的解决方案。

【讨论】:

  • 附带说明:如果您有一系列处理,您确实希望这些值超出范围,以便将动态范围保留到最后(虽然应该很少需要一个范围到外面去;你想在一个 sweet.spot 级别工作,具体取决于需要什么处理)。钳位是一种方法,但我建议改为使用限制器,也就是最后的快速(攻击)compressor node
【解决方案2】:

AudioBuffer 中的数据不要求必须在 [-1,1] 范围内。但是,最终进入输出设备的数据应该在该范围内,否则您可能会得到不必要的失真。 (会发生什么取决于浏览器,但大概大多数只会限制在该范围内。)

由于您是从文件中获取数据,因此我建议您简单地对数据应用比例因子。比如说,将所有内容乘以 0.99。或者将所有内容除以您看到的最大值。

剪辑可能会导致失真,尽管这在您的示例中可能无关紧要。缩放不会失真,但您会丢失信号中非常安静的部分。

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2013-10-21
    • 2012-10-28
    相关资源
    最近更新 更多