读取/写入/复制ArrayBuffer到另一个具有偏移量的ArrayBuffer
假设我有一个ArrayBuffer
,它是一个mp4
文件。 我想创build一个新的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
现在,在这一点上,我不知道如何将data
的内容写入新的ab
缓冲区,所以最后我有一个ArrayBuffer
,它包含了开头的3组数字以及整个内容的video。
我尝试使用以下内容:
view.setInt32(10, data.buffer)
虽然我没有错误,但是数据并没有写入缓冲区。 我无法将video写入文件并播放:
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
不正确,或者我是否正确提取缓冲区 – 但是写入的test.mp4
不包含正确的二进制数据。
经过更多的挖掘,我终于能够拼凑出一个可行的解决scheme。 这成功地将mp4
ArrayBuffer
的内容从偏移量(具有头信息)复制到新的ArrayBuffer
:
new Uint8Array(ab, 0, ab.byteLength).set(new Uint8Array(data), 10);
这里我在ArrayBuffer
上创build一个types为Uint8Array
的视图,它也包含头信息( ab
) 。 指定我用来创buildArrayBuffer
的相同大小。
用新创build的视图,然后我调用.set
函数,第一个参数是原始的mp4
ArrayBuffer
,我也给了一个Uint8Array
视图,并告诉set
命令从偏移10
开始。
这将所有的data
内容从偏移量10
分配到ab
。