关于js中的ArrayBuffer
- ArrayBuffer 是视图或TypeArray的底层缓冲区,不能直接操作ArrayBuffer,需要通过视图或TypeArray来操作它
- TypeArray是类型数组,具体化的由Uint8Array等,视图由DataView
- Buffer 实际上就是Uint8Array
下面是操作ArrayBuffer的示例
- 步骤1是将数据读取到Buffer中;
- 步骤2、3过程是将Buffer中的内容复制到新创建的ArrayBuffer中,需要通过Uint8Array来完成
- 最后通过Uint8Array将ArrayBuffer中的数据写到文件中
var buf = fs.readFileSync('D://test_1280x720.yuv');
var bufY = buf.slice(0,frameInfo.width*frameInfo.height);
var bufU = buf.slice(frameInfo.width*frameInfo.height,frameInfo.width*frameInfo.height*1.25);
var bufV = buf.slice(frameInfo.width*frameInfo.height*1.25,frameInfo.width*frameInfo.height*1.5);
var yArrayBuf = new ArrayBuffer(bufY.length);
var yView = new Uint8Array(yArrayBuf);
for(var i=0;i<bufY.length;i++){
yView[i] = bufY[i];
}
var uArrayBuf = new ArrayBuffer(bufU.length);
var uView = new Uint8Array(uArrayBuf);
for(var i=0;i<bufU.length;i++){
uView[i] = bufU[i];
}
var vArrayBuf = new ArrayBuffer(bufV.length);
var vView = new Uint8Array(vArrayBuf);
for(var i=0;i<bufV.length;i++){
vView[i] = bufV[i];
}
if(count < 1){
var fd = fs.openSync('D://stream.yuv','w+');
fs.writeSync(fd,bufY, 0, frameInfo.width*frameInfo.height);
fs.writeSync(fd,bufU, 0, frameInfo.width*frameInfo.height/4);
fs.writeSync(fd,bufV, 0, frameInfo.width*frameInfo.height/4);
var fd1 = fs.openSync('D://streamBufAll.yuv','w+');
fs.writeSync(fd1,buf, 0, frameInfo.width*frameInfo.height*1.5);
count = 1;
}
DataView示例
var header = new ArrayBuffer(20);
var dv = new DataView(header);
dv.setUint8(0,1);
dv.setUint8(1,0);
dv.setUint16(2,frameInfo.width);
dv.setUint16(4,frameInfo.height);
dv.setUint16(6,0);
dv.setUint16(8,0);
dv.setUint16(10,0);
dv.setUint16(12,0);
dv.setUint16(14,0);
dv.setUint32(16,Date.parse(new Date()));