Javascript getChannelData 一些越界
Javascript getChannelData some out of bounds
当我这样做时 audioBuffer.getChannelData 我期待一个 Float32Array,其中所有元素都在 -1 和 1 之间。但是对于某些文件,某些元素高达 1.018
根据网络文档 "needs to be in [-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
我能够在 Windows 的 Firefox 上重现它。不确定为什么会得到这些超出范围的值,但是 spec says
The range of all audio signals at a destination node of any audio
graph is nominally [-1, 1]. The audio rendition of signal values
outside this range, or of the values NaN, positive infinity or
negative infinity, is undefined by this specification.
未定义意味着在这种情况下您可以做任何您喜欢的事情。夹紧似乎是一个合理的解决方案。
不要求AudioBuffer
中的数据必须在[-1,1]范围内。然而,最终进入输出设备的数据应该在那个范围内,否则你可能会得到不需要的失真。 (会发生什么取决于浏览器,但大概大多数会限制在该范围内。)
由于您是从文件中获取数据,我建议您简单地对数据应用比例因子。比如说,将所有内容乘以 0.99。或者将所有内容除以您看到的最大值。
剪辑可能会导致失真,尽管这在您的示例中可能无关紧要。缩放不会失真,但您会丢失信号中非常非常安静的部分。
当我这样做时 audioBuffer.getChannelData 我期待一个 Float32Array,其中所有元素都在 -1 和 1 之间。但是对于某些文件,某些元素高达 1.018
根据网络文档 "needs to be in [-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
我能够在 Windows 的 Firefox 上重现它。不确定为什么会得到这些超出范围的值,但是 spec says
The range of all audio signals at a destination node of any audio graph is nominally [-1, 1]. The audio rendition of signal values outside this range, or of the values NaN, positive infinity or negative infinity, is undefined by this specification.
未定义意味着在这种情况下您可以做任何您喜欢的事情。夹紧似乎是一个合理的解决方案。
不要求AudioBuffer
中的数据必须在[-1,1]范围内。然而,最终进入输出设备的数据应该在那个范围内,否则你可能会得到不需要的失真。 (会发生什么取决于浏览器,但大概大多数会限制在该范围内。)
由于您是从文件中获取数据,我建议您简单地对数据应用比例因子。比如说,将所有内容乘以 0.99。或者将所有内容除以您看到的最大值。
剪辑可能会导致失真,尽管这在您的示例中可能无关紧要。缩放不会失真,但您会丢失信号中非常非常安静的部分。