Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 读取/写入/复制一个带偏移量的ArrayBuffer到另一个ArrayBuffer_Javascript_Node.js_Binary Data_Arraybuffer - Fatal编程技术网

Javascript 读取/写入/复制一个带偏移量的ArrayBuffer到另一个ArrayBuffer

Javascript 读取/写入/复制一个带偏移量的ArrayBuffer到另一个ArrayBuffer,javascript,node.js,binary-data,arraybuffer,Javascript,Node.js,Binary Data,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) v

假设我有一个
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
现在,在这一点上,我不知道如何将
data
的内容写入新的
ab
缓冲区,因此,最后我有一个
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();
}
在上面的函数中,我检索到的所有数字都是正确的,但是当我尝试将有效负载数据写入文件时,该文件的大小是正确的,但它已损坏

    file size: 5253880
  buffer size: 5253890
-- reading data
 first header: 29102
second header: 18282
 third header: 576
new file size: 5253880

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

在进一步挖掘之后,我终于能够拼凑出一个可行的解决方案。这将成功地将
mp4
ArrayBuffer
的内容从偏移量(具有标题信息)复制到新的
ArrayBuffer

在这里,我在
ArrayBuffer
上创建一个类型为
Uint8Array
的视图,该视图还包含头信息(
ab
)。指定与创建
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
在这个新创建的视图中,我调用
.set
函数,第一个参数是原始的
mp4
ArrayBuffer
,我也给它一个
Uint8Array
视图,并告诉
set
命令从偏移量
10
开始


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

您不能只执行
查看。setInt32(10,数据)
?然后使用
view.buffer
@Sachin获取新的ArrayBuffer-我根据您的评论更新了我的问题,但无法验证数据的存储或提取是否是问题所在。@Sachin-如果您对如何完成感兴趣,我想出了一个解决方案。这是一个很好的方法。