【问题标题】:How to convert Blob to Int16Array如何将 Blob 转换为 Int16Array
【发布时间】:2016-09-20 13:02:47
【问题描述】:

我在 Blob 中有一个 WAV 文件,为了将其转换为 MP3,我需要先将其转换为 Int16Array(按照此处的示例:https://github.com/zhuker/lamejs)。

例如

var mp3encoder = new lamejs.Mp3Encoder(2, 44100, 128);
// instead of `var samples = new Int16Array(44100);` I want something like `var samples = new Int16Array(blob);`
var mp3Tmp = mp3encoder.encodeBuffer(samples);

这可能吗?

【问题讨论】:

标签: javascript mp3


【解决方案1】:

如果您知道数据实际上是 16 位 ints 的 blob,那么是的,有可能:

  1. 通过arrayBuffer 方法将Blob 读入ArrayBuffer (原来的答案必须使用FileReader,但现在Blob 有一个arrayBuffer 方法;如果出于某种原因,您必须支持没有它的旧环境)

    samples.arrayBuffer()
    .then(buffer => {
        // ...
    })
    .catch(error => {
        // ...handle/report error...
    });
    
  2. 通过Int16Array constructorArrayBuffer 视为Int16Array

    const data = new Int16Array(buffer);
    

现在data 是来自被视为Int16Array 的blob 的数组缓冲区。

类似的东西:

samples.arrayBuffer()
.then(buffer => {
    const data = new Int16Array(buffer);
    // ...use `data` here...
})
.catch(error => {
    // ...handle/report error...
});

【讨论】:

  • 现在我可以投票了 :) 注意你也可以使用 onload 事件参数.target.result
  • 对我不起作用:有时会出现此错误,有时只会将“pssh”保存为 mp3 未捕获 RangeError:Int16Array 的字节长度应为 2 的倍数
  • @DmitryMind - 该错误意味着您没有包含 16 位 int 值的 blob。如果你这样做了,它的长度将是 2 的倍数。从答案的第一句话开始:“如果你知道数据实际上是一个 16 位整数的 blob...”
  • 我通过 mediaRecorder 从麦克风获取 blob,如何控制这些值?
  • @DmitryMind - 我不知道,我没用过。但我不希望它返回 16 位 int 值,看着 the MDN docs 它似乎更有可能是字节。所以你需要Uint8ArrayInt8Array 而不是Int16Array(如果我是正确的话)。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2012-10-02
  • 2021-07-27
  • 2017-01-17
  • 2012-12-29
  • 2021-05-03
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多