读取/写入/将ArrayBuffer复制到具有偏移量的另一个ArrayBuffer中

时间:2016-03-29 12:17:06

标签: javascript node.js binary-data arraybuffer

我们说我有ArrayBuffer这是mp4个文件。我想创建一个新的ArrayBuffer,其中包含一些额外的字节用作标头信息,然后将mp4缓冲区存储在新ArrayBuffer的其余部分中。< / p>

// ... assume the `data` variable is an existing ArrayBuffer with the contents
// of the mp4 video file.

var ab = new ArrayBuffer(10 + data.byteLength)
var view = new DataView(ab);

view.setInt32(0, 29102); // header information 1
view.setInt32(4, 18282); // header information 2
view.setInt16(8, 576); // header information 3

现在,在这一点上,我无法弄清楚如何将data的内容写入新的ab缓冲区,以便最终得到{{1}其中包含3组数字,以及视频的全部内容。

我尝试使用以下内容:

ArrayBuffer

虽然我没有错误,但数据实际上并未写入缓冲区。我无法将视频写入文件并播放:

view.setInt32(10, data.buffer)

在上面的函数中,我检索的所有数字都是正确的,但是当我尝试将有效负载数据写入文件时,文件大小正确,但是它已损坏。

function readPayload(ab) {
    var view = new DataView(ab);
    console.log(' first header: ' + view.getInt32(0)); // correct
    console.log('second header: ' + view.getInt32(4)); // correct
    console.log(' third header: ' + view.getInt16(8)); // correct
    var data = new Buffer(ab.slice(10));
    console.log('new file size: ' + data.byteLength); // correct length of mp4 file

    var ws = fs.createWriteStream('test.mp4');  // this wrote a corrupt file
    ws.write(data);
    ws.end();
}

因此我无法判断它是否错误地存储在新 file size: 5253880 buffer size: 5253890 -- reading data first header: 29102 second header: 18282 third header: 576 new file size: 5253880 中,或者我是否错误地提取缓冲区 - 但是ArrayBuffer是write不包含正确的二进制数据。

1 个答案:

答案 0 :(得分:5)

经过多次挖掘,我终于能够拼凑出可行的解决方案。这已成功将mp4 ArrayBuffer的内容从偏移(具有标题信息)复制到新ArrayBuffer中:

new Uint8Array(ab, 0, ab.byteLength).set(new Uint8Array(data), 10);

我在Uint8Array创建了ArrayBuffer类型的视图,其中还包含标题信息ab。指定我用于创建ArrayBuffer的相同大小。

使用新创建的视图,然后我调用.set函数,第一个参数是原始mp4 ArrayBuffer,我给出Uint8Array 1}}查看,并告诉set命令从偏移10开始。

这会将data的所有内容从ab偏移量分配给10