這邊從 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 );