定義 function ffmpeg,記得要將可執行檔 ffmpeg 放在目前目錄底下:
1. 這是原始function的定義,傳進來參數命名為 options, 檔名: child.js
function ffmpeg(options) {
const child = require('child_process'); // 調用內建child_process程式庫
var cmd =__dirname+'/ffmpeg ' + options; // 傳給child_process 時所需要的參數
child.exec(cmd,function (err, stdout, stderr) { // child_proces開始處理指令
if( err ) console.log('出錯了:'+err+'\nstderr:'+stderr);
else console.log('成功了:'+stdout);
}); // end child_process
} // end of ffmpeg
ffmpeg('-version'); // 呼叫 ffmpeg 函式:
2. 這是將上述 function ffmpeg(options )轉化成 Promise 的用法, 檔名: child.js
function ffmpeg(options) {
return new Promise(function (ok,ng) {//回傳 closure,將會有兩個callback function
const child = require('child_process');
var cmd =__dirname+'/ffmpeg ' + options;
child.exec(cmd, function (err, stdout, stderr) {
if( err ) ng('出錯了:'+err+'\nstderr:'+stderr);// 回調(callback) ng
else ok('成功了:'+stdout); // 回調(callback) ok
}); // end child_process
}); // end of closure
} // end of ffmpeg
// 轉化成 Promise,就可以呼叫 then( ) 及 catch( ), 執行指令:
ffmpeg('-version').then(console.log).catch(console.log);
// 其中 then( ) 裡面的 callback 對應到 ok, 而 catch( ) 裡面的 callback 對應到 ng
3. 存檔用 nodejs 執行
js child.js
p.s. 轉檔時, 避免操壞硬碟, 改用 RAMDISK, linux 的 ramdisk 位置在 /dev/shm, 參考範例:
var fs = require('fs'),
var dirRAM='/dev/shm/hls'; // create a directory in ramdisk
fs.mkdir(dirRAM, function(err) {
fs.symlink(dirRAM, __dirname + '/hls', function(errlink ) { // create a symbolic link
process.chdir(__dirname + '/hls'); // enter to the directory
ffmpeg('-i '+ __dirname + '/oceans.mp4 -hls_flags delete_segments playlist.m3u8').then(console.log).catch(console.log); // media file transcode
})
})
沒有留言:
張貼留言