使用 chrome 进行 OfflineAudioContext FFT 分析

2024-04-13

我正在尝试构建一个波形生成器,它获取音频文件幅度值并在 JavaScript 中尽快(比实时更快)将它们显示到画布上。所以我使用 OfflineAudioContext / webkitOfflineAudioContext ,加载文件并开始分析。 波形要填满宽阔的画布。

我分析了processor.onaudioprocess函数中的缓冲区。 (我猜这就是它的工作原理?)

它在 Firefox 中工作正常,但我在 chrome 中遇到了一个问题:它似乎“跳过”了很多分析以尽快完成它的工作,并且只返回一些坐标(例如 16)。

这是 jsfiddle :http://jsfiddle.net/bestiole/95EBf/ http://jsfiddle.net/bestiole/95EBf/

// create the audio context
if (! window.OfflineAudioContext) {
    if (! window.webkitOfflineAudioContext) {
        $('#output').append('failed : no audiocontext found, change browser');
    }
    window.OfflineAudioContext = window.webkitOfflineAudioContext;
}
//var context = new AudioContext();
var length = 15241583;
var samplerate = 44100;
var fftSamples = 2048;
var waveformWidth = 1920;

var context = new OfflineAudioContext(1,length,samplerate);
var source;
var splitter;
var analyser;
var processor;
var i=0;
var average;
var max;
var coord;

processor = context.createScriptProcessor(fftSamples, 1, 1);
processor.connect(context.destination);

analyser = context.createAnalyser();
analyser.smoothingTimeConstant = 0;
analyser.fftSize = fftSamples;

source = context.createBufferSource();
splitter = context.createChannelSplitter();
source.connect(splitter);
splitter.connect(analyser,0,0);

analyser.connect(processor);

context.oncomplete = function(){
    $('#output').append('<br />complete');
}

var request = new XMLHttpRequest();
request.open('GET', "http://www.mindthepressure.org/bounce.ogg", true);
request.responseType = 'arraybuffer';
request.onload = function(){
    $('#output').append('loaded ! ');
    context.decodeAudioData(request.response, function(buffer) {
        $('#output').append('starting analysis<br />');
        processor.onaudioprocess = function(e){
            var data =  new Uint8Array(analyser.frequencyBinCount);
            analyser.getByteFrequencyData(data);
            average = getAverageVolume(data);
            max = Math.max.apply(Math, data);
            coord = Math.min(average*2,255);
            coord = Math.round((max+coord)/2);
            ctx.fillStyle=gradient;
            ctx.fillRect(i,255-coord,1,255);
            console.log(i+' -> '+coord);
            i++;
        }
        source.buffer = buffer;
        source.start(0);
        context.startRendering();
    }, onError);
}
request.send();

function onError(e) {
    $('#output').append('error, check the console');
    console.log(e);
}

function getAverageVolume(array) {
    var values = 0;
    var average;
    var length = array.length;
    for (var k = 0; k < length; k++) {
        values += array[k];
    }
    average = values / length;
    return average;
}

(这是另一个版本,强制波形适合 1920px 宽并为感兴趣的人生成波形数据:http://jsfiddle.net/bestiole/E3rSx/ http://jsfiddle.net/bestiole/E3rSx/ )

我真的不明白,chrome 不处理音频文件的每个部分吗?

谢谢你的帮助 !


Chrome 在离线模式下的脚本处理器中存在错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 chrome 进行 OfflineAudioContext FFT 分析 的相关文章

随机推荐

  • 客户端验证不会针对 CompareAttribute DataAnnotation 触发

    我正在布置一个比较两个密码字符串的视图 我的模型之一的两个属性非常简单 Required RegularExpression S ErrorMessage White space is not allowed StringLength 20
  • 方法和内部类同名(错误:...与先前的声明冲突)

    我打算有一个类 它有一个内部类和一个名称相似的方法 的代码为example1 cpp即使我有一个内部类和一个同名的方法 编译也没有问题B While example2 cpp如果我重命名将不起作用Position to position用小
  • Kotlin - 在 Android 中转换 Singleton DatabaseController 的最佳方式

    我正在通过 Kotlin in Action 学习 Kotlin 并且正在慢慢地将 Android 应用程序代码转换为它 但我在转换下面的类时发现了一些问题 public class DatabaseController private s
  • VueJS:使用对象文字与返回对象的函数定义“数据”

    定义之间有什么区别data对象可以通过以下方式 1 使用对象字面量 data title Helly VueJS 2 函数返回对象 data return title Helly VueJS 来自文档 https v2 vuejs org
  • 如何使用 pyinstaller 创建最小大小的可执行文件?

    我使用的是 Windows 10 安装了 anaconda 但我想使用 python 3 5 在一个新的 干净的最小环境中独立创建一个可执行文件 所以我做了一些测试 测试1 我在文件夹 testenv 中创建了一个 python 脚本 te
  • 在mysql中选择两个独立的表[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 results mysqli gt query SELECT product name price FROM herbs an WHERE
  • 双倍的 Pow 实现

    我正在开发一个用于运动控制的代码 但我遇到了 pow 函数的问题 我使用VS2010作为IDE 这是我的问题 我有 double p 100 0000 double d 1000 0000 t1 pow p 8 0000 d 1 00 4
  • YouTube.Builder 的正确使用方法

    我需要获取用户 YouTube 视频 这是我的代码 仅尝试获取用户 YouTube 频道 但它不起作用 选择帐户后 加载Youtube频道总是抛出错误 我读了这个answer https stackoverflow com a 214077
  • 如何使用类库中的控制器?

    我在类库中有控制器 但我无法弄清楚如何让主项目识别它们 主项目引用了我的类库 我需要在某处注册它们吗 我想同时使用控制器和 ApiController EDIT 路线配置 创建项目后未更改 public class RouteConfig
  • 在 swift 中将 UIImage 转换为 base64 字符串

    我正在尝试将 UIImage 转换为 base64 字符串 目的是将其上传到后端服务器 然而 我在这篇文章中找到的转换代码 应该是Apple自己的实现 生成了一个无效的字符串 UIImage 和 Base64 字符串之间的转换 https
  • Javafx程序可以通过GUI和命令行控制吗?

    我正在使用 Javafx GUI 但我也需要来自命令行的相同级别的功能 我想知道创建一个同时具有命令行和 Javafx 功能的主类的最佳方法是什么 这样您就可以在 GUI 上做一件事 然后在命令行上做下一件事 命令行还会更新 GUI 显示
  • CSV 日期格式

    我有一个 VB 应用程序 它提取数据并创建 3 个 CSV 文件 a csv b csv c csv 然后我使用另一个 Excel 电子表格 import xls 将上述 CSV 文件中的所有数据导入到此工作表中 import xls 文件
  • 使用 python 进行多元线性回归

    我想用 python 计算多元线性回归 我找到了这个简单线性回归的代码 import numpy as np from matplotlib pyplot import x np array 1 2 3 4 5 y np array 2 3
  • 无法启动服务器。服务器实例未配置

    在尝试为我的项目设置 tomcat 服务器时 出现以下错误 请参阅下面的完整堆栈跟踪 java lang ClassNotFoundException com springsource tcserver serviceability dep
  • libstdc++.so.6 与 cuda 相关的链接器问题

    今天我在链接我编译的 cuda 内容时遇到了问题 我有一个最新的 debian 测试 w 2 6 32 3 amd64 我整天都在写我的代码 不时编译 没有问题 但在进行了较小的代码更改后 我收到以下错误 gcc o pa CUDA o h
  • 在 ASP.Net Core 2 MVC 中禁用模型验证的正确方法

    使用扩展方法设置 MVC services AddMvc 然后在控制器中 这也可能适用于 GET 使用主体中提供的参数创建 POST 操作的方法 例如 HttpPost save public Entity Save FromBody En
  • 如何在 php 中实现位掩码?

    我不确定位掩码是否是正确的术语 让我解释 在 PHP 中 error reporting函数可以通过多种方式调用 Report simple running errors error reporting E ERROR E WARNING
  • Delphi:如何停止 TAction 快捷键自动重复?

    我正在使用 Delphi TActionList 带有用于某些操作的快捷键 我想防止某些操作被键盘自动重复多次触发 但我确实这样做not想要影响全局自动重复操作 这样做的最佳方法是什么 澄清 我仍然需要处理多个快速按键 这是only我想忽略
  • 如何使用扫描仪使该 switch 语句起作用?

    我正在尝试编写一个程序 将字母表中的任何字母 大写或小写 转换为拼音字母表 例如 如果我输入 A 或 a 我的程序会给我 将其更改为 Alpha 我对此和 switch 语句做了很多研究 但我总是陷入困境 我意识到我不能在扫描仪中使用 ch
  • 使用 chrome 进行 OfflineAudioContext FFT 分析

    我正在尝试构建一个波形生成器 它获取音频文件幅度值并在 JavaScript 中尽快 比实时更快 将它们显示到画布上 所以我使用 OfflineAudioContext webkitOfflineAudioContext 加载文件并开始分析