這邊從 stdout 或 stderr 流輸入給 ffmpeg 做壓縮,主要就是利用 pipe 做 IPC
寫個小程式順便比較 javascript (nodejs) 和 C 語言的速度差異,最佳化的結果是 javascript 輸出到 stderr 幾乎等速於 C 語言,令人有點意外XD;反而直出到 stdout 的速度比 C 語言慢了 30%,這不太科學 。
題外話是 stderr 通常不會有 buffer 的問題,大多數時候都不用擔心沒有 flush 乾淨

演算法筆記
輸入一組路徑,轉換成 sprintf format
如把
'D:\\\\workspace\\path-parser\\img\\img_0005.txt'
轉換為
D:\\\\workspace\\path-parser\\img\\img_%04d.txt
基本上就是個掃目錄的蠢方法,反正成功了…演算法如下,後面附上 Javascript code
const zlib = require('zlib');
const fs = require('fs');
// generate data
let buf = Buffer.alloc(4 * 240 * 135);
for (let y = 0, i = 0; y < 135; ++y) {
for (let x = 0; x < 240; ++x, ++i) {
buf.writeFloatBE(x*y, i*4);
}
}
// compress
let bufCompress = zlib.deflateSync( buf );
console.log( bufCompress );
// write file
let file = fs.openSync('data.z', 'w+');
fs.writeSync( file, 'test\nabc\n' ); // write some header
fs.writeSync( file, bufCompress, 0, bufCompress.length ); // write compressed data
fs.closeSync( file );
// read file
let readBuf = fs.readFileSync('data.z');
let readArr = readBuf.toString().split('\n');
console.log( readArr[0] );
console.log( readArr[1] );
let offset = readArr[0].length + readArr[1].length + 2;
bufCompress = readBuf.slice(offset);
console.log( bufCompress );
// decompress
let bufUncompress = zlib.inflateSync( bufCompress );
// check data
for (let i = 0; i < 240*135*4; ++i) {
if ( buf[i] != bufUncompress[i] ) {
console.log( 'error' );
}
}
console.log( buf.length );
console.log( bufCompress.length );
console.log( bufUncompress.length );