Javascript 画布到ffmpeg-无效数据错误
我现在正在尝试将一些原始数据直接导入ffmpeg。数据来自画布。我所做的是:Javascript 画布到ffmpeg-无效数据错误,javascript,canvas,ffmpeg,pipe,rgb,Javascript,Canvas,Ffmpeg,Pipe,Rgb,我现在正在尝试将一些原始数据直接导入ffmpeg。数据来自画布。我所做的是: var imageData = ctx.getImageData(0,0,600,600); var dataArray = imageData.data; var rgbArray = []; for (var i = 0; i < dataArray.length; i+=4) { rgbArray.push([dataArray[i], dataArray[i+1], dataArray[i+2]]
var imageData = ctx.getImageData(0,0,600,600);
var dataArray = imageData.data;
var rgbArray = [];
for (var i = 0; i < dataArray.length; i+=4) {
rgbArray.push([dataArray[i], dataArray[i+1], dataArray[i+2]])
}
var rgb24Array = rgbArray.map(function(rgbList){
return (rgbList[0] << 16) | (rgbList[1] << 8) | (rgbList[2])
});
基本上,我从画布上获得的图像数据每个像素有4个元素(rgba),我首先过滤掉rgb值,然后将它们打包发送到ffmpeg,我直接将它们像ffmpeg.stdin.write(rgb24Array)
一样导入
但是我得到了一个类型错误:无效数据,我不知道为什么。。。我还试图保持数据原样,并使用rgba
作为pix_fmt
,但错误相同
错误的堆栈跟踪是:
TypeError: invalid data
at Socket.write (net.js:617:11)
at null._repeat (....line with ffmpeg.stdin.write() in it)
at wrapper [as_onTimeout] (timers.js:275:11)
at Timer.listonTimeout (timers.js:92:15)
有人知道问题出在哪里吗
编辑:
更改了一些内容,首先,我现在使用Uint8Array:
var imageData = ctx.getImageData(0,0,600,600);
var srcArray = imageData.data;
var dstArray = new Uint8Array(imageData.width * imageData.height * 3);
for(var i = 0, p = 0; i < srcArray.length; i++) { // i++ skips alpha
dstArray[p++] = srcArray[i++]; // red comp. and incr.
dstArray[p++] = srcArray[i++]; // green comp. and incr.
dstArray[p++] = srcArray[i++]; // blue comp. and incr.
}
ffmpeg.stdin.write(dstArray);
var-imageData=ctx.getImageData(0,0600600);
var srcArray=imageData.data;
var dstArray=新的Uint8Array(imageData.width*imageData.height*3);
对于(var i=0,p=0;i
还向ffmpegArgs添加了-video\u size
参数。但它仍然不起作用,我也会犯同样的错误。我正在退出(暂时删除答案)。如果可以的话,我今天晚些时候再去看看。同时,可能还有其他人熟悉与套接字/协议等相关的问题@K3N好的,谢谢你。你解决过这个问题吗?
var imageData = ctx.getImageData(0,0,600,600);
var srcArray = imageData.data;
var dstArray = new Uint8Array(imageData.width * imageData.height * 3);
for(var i = 0, p = 0; i < srcArray.length; i++) { // i++ skips alpha
dstArray[p++] = srcArray[i++]; // red comp. and incr.
dstArray[p++] = srcArray[i++]; // green comp. and incr.
dstArray[p++] = srcArray[i++]; // blue comp. and incr.
}
ffmpeg.stdin.write(dstArray);