ffmpeg pipe example

這邊從 stdout stderr 流輸入給 ffmpeg 做壓縮,主要就是利用 pipe IPC

寫個小程式順便比較 javascript (nodejs) 和 C 語言的速度差異,最佳化的結果是 javascript 輸出到 stderr 幾乎等速於 C 語言,令人有點意外XD;反而直出到 stdout 的速度比 C 語言慢了 30%,這不太科學 。

題外話是 stderr 通常不會有 buffer 的問題,大多數時候都不用擔心沒有 flush 乾淨

Github code

 

閱讀全文〈ffmpeg pipe example〉

Javascript file path format extraction

輸入一組路徑,轉換成 sprintf  format

如把

'D:\\\\workspace\\path-parser\\img\\img_0005.txt'

轉換為

D:\\\\workspace\\path-parser\\img\\img_%04d.txt

基本上就是個掃目錄的蠢方法,反正成功了…演算法如下,後面附上 Javascript code

  1. 把輸入路徑轉換成 regex (這邊假定是索引最後一組數字字串)
  2. 在對應目錄下用 regex 找符合的檔名,紀錄最長和最短檔名長度
  3. 如果長度相同,就是有 zero padding ( e.g. %04d ),反之沒有
  4. 根據有沒有 zero padding 決定 format 要怎寫

閱讀全文〈Javascript file path format extraction〉

zlib node.js example

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 );