Javascript getChannelData超出范围

时间:2018-07-09 19:25:56

标签: javascript html5-audio web-audio

当我执行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

2 个答案:

答案 0 :(得分:1)

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

  

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

未定义表示在这种情况下您可以执行任何操作。夹紧似乎是一个合理的解决方案。

答案 1 :(得分:0)

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

由于要从文件中获取数据,因此建议您仅对数据应用比例因子。说,将所有内容乘以.99。或将所有内容除以您看到的最大值。

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