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

Nic*_*ngs 1 javascript binary-data node.js arraybuffer

假设我有ArrayBuffer一个mp4文件.我想创建一个ArrayBuffer带有一些额外字节的新函数作为头信息,然后将mp4缓冲区存储在新的剩余部分中ArrayBuffer.

// ... 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
Run Code Online (Sandbox Code Playgroud)

现在,在这一点上,我无法弄清楚如何将内容写入dataab缓冲区,因此,最后我有一个ArrayBuffer包含3组数字的开头,以及视频的全部内容.

我尝试使用以下内容:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

    file size: 5253880
  buffer size: 5253890
-- reading data
 first header: 29102
second header: 18282
 third header: 576
new file size: 5253880
Run Code Online (Sandbox Code Playgroud)

所以我无法判断它是否被ArrayBuffer错误地存储在新的中,或者我是否正在错误地提取缓冲区 - 但是test.mp4写入的内容不包含正确的二进制数据.

Nic*_*ngs 5

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

new Uint8Array(ab, 0, ab.byteLength).set(new Uint8Array(data), 10);
Run Code Online (Sandbox Code Playgroud)

在这里,我创建类型的视图Uint8ArrayArrayBuffer也包含了头信息(ab).指定我用来创建它的相同大小ArrayBuffer.

使用新创建的视图,然后我调用该.set函数,第一个参数是mp4 ArrayBuffer提供Uint8Array视图的原始参数,并告诉set命令从偏移量开始10.

这将从偏移量中分配datato的所有内容.ab10