相关疑难解决方法(0)

Chrome内存问题 - 文件API + AngularJS

我有一个需要将大文件上传到Azure BLOB存储的Web应用程序.我的解决方案使用HTML5 File API切片成块,然后将块作为blob块放置,块的ID存储在数组中,然后块作为blob提交.

该解决方案在IE中运行良好.在64位Chrome上,我已经成功上传了4Gb文件但是看到了非常大的内存使用量(2Gb +).在32位Chrome上,特定的镀铬工艺将达到约500-550Mb然后崩溃.

我看不到任何明显的内存泄漏或我可以改变以帮助垃圾收集的事情.我将块ID存储在一个数组中,所以显然会有一些内存蠕变,但这不应该很大.这几乎就像File API将整个文件保存在内存中一样.

它是作为一个从控制器调用的Angular服务编写的,我认为只是服务代码是相关的:

(function() {
    'use strict';

    angular
    .module('app.core')
    .factory('blobUploadService',
    [
        '$http', 'stringUtilities',
        blobUploadService
    ]);

function blobUploadService($http, stringUtilities) {

    var defaultBlockSize = 1024 * 1024; // Default to 1024KB
    var stopWatch = {};
    var state = {};

    var initializeState = function(config) {
        var blockSize = defaultBlockSize;
        if (config.blockSize) blockSize = config.blockSize;

        var maxBlockSize = blockSize;
        var numberOfBlocks = 1;

        var file = config.file;

        var fileSize = file.size;
        if (fileSize < blockSize) {
            maxBlockSize = …
Run Code Online (Sandbox Code Playgroud)

javascript html5 google-chrome azure fileapi

11
推荐指数
1
解决办法
1030
查看次数

使用 AudioWorklet 传输捕获的音频时如何防止中断/不稳定/故障?

我们一直在开发基于 JavaScript 的音频聊天客户端,该客户端在浏览器中运行并通过 WebSocket 将音频样本发送到服务器。我们之前尝试使用 Web Audio API 的 ScriptProcessorNode 来获取样本值。这在我们的台式机和笔记本电脑上运行良好,但在从我们必须支持的手持平台传输时,我们遇到了较差的音频质量。我们将此归因于记录的脚本处理器性能问题(https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)。在手持设备上,脚本处理器缓冲区大小为 2048,音频始终出现中断。在下一个最大大小间隔 (4096),音频很流畅(没有中断),但延迟太多(大约两秒)。

我们从 ScriptProcessorNode 获得的结果促使我们尝试使用 Audio Worklet。不幸的是,在我们的工作集实现中,音频质量更差:中断和延迟,即使在我们的笔记本电脑上也是如此。我想知道是否有一种方法可以调整我们的工作集实现以获得更好的性能,或者我们所经历的是否是音频工作集当前状态的预期(“符合课程标准”)(Chromium 问题796330813825836306似乎相关)。

以下是有关代码功能的更多详细信息:

  1. 使用从 getUserMedia 获取的 MediaStream 创建 MediaStreamStreamSourceNode。
  2. 将源节点连接到我们的工作集节点实现(扩展 AudioWorkletNode)。
  3. 我们的工作集处理器实现(扩展 AudioWorkletProcessor)缓冲作为其处理方法的“输入”参数到达的块。
  4. 当缓冲区已满时,使用 MessagePort 将缓冲区内容发送到工作集节点。
  5. Worklet 节点通过 WebSocket 连接传输缓冲区内容。

其工艺方法如下。var“samples”是一个 Float32Array,它被初始化为缓冲区大小并重用。我对缓冲区大小进行了一些尝试,但似乎没有影响。该方法基于AudioWorklet:Web 音频的未来第 4.1 节中的指导,以最大限度地减少内存分配。

if (micKeyed == true) {

    if (inputs[0][0].length == framesPerBlock) {
        samples.set(inputs[0][0], currentBlockIndex * framesPerBlock);
        currentBlockIndex++;

        if (currentBlockIndex == lastBlockIndex) {
            // console.log('About to send buffer.');
            this.port.postMessage(samples);
            currentBlockIndex = …
Run Code Online (Sandbox Code Playgroud)

javascript websocket getusermedia scriptprocessor web-audio-api

5
推荐指数
0
解决办法
962
查看次数