在node中使用ffmpeg外掛
FFmpeg 是一個自由軟體,可以執行音訊和視訊多種格式的錄影、轉換、流功能,包含了 libavcodec——這是一個用於多個專案中音訊和視訊的解碼器庫,以及 libavformat——一個音訊與視訊格式轉換庫。 “FFmpeg”這個單詞中的“FF”指的是“Fast Forward”。ffmpeg外掛提供了一組函式和實用程式來抽象 ffmpeg 的命令列用法。
當你發現,,實際開發中會有各種各樣奇怪的需求,上傳檔案之類的都算是小事情了,從視訊中擷取幀這種,,也只能想辦法實現了 ?。幸好 node 的外掛庫很豐富,ffmpeg 這款外掛就可以滿足我們對視訊操作的一些基本需求,據我簡單分析,外掛應該是呼叫了 node 子程式模組的 excu()方法,直接呼叫了 ffmpeg 軟體的控制檯命令,對於其他外掛沒有提供的方法可以參照這個思路實現。
一.安裝 ffmpeg
- 安裝 ffmpeg 軟體 使用 ffmpeg 外掛首先需要電腦有 ffmpeg 軟體環境,安裝 ffmpeg 需要 brew 環境。
-
安裝 brew,執行以下命令
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
這個過程沒有 vpn 的話有點慢,可以搜尋其他安裝方式,這裡不細講。 -
安裝 ffmpeg
brew install ffmpeg
這個過程也要安裝很多東西,有點久,還可以到官網下載安裝包,不過需要配置,自行谷歌吧。
-
安裝外掛 在專案中執行下面 ? 的命令
npm install ffmpeg
-
引入外掛
var ffmpeg = require('ffmpeg');
-
使用外掛建立例項 ffmpeg 外掛中所有的方法都可以使用回撥函式或 Promise 兩種方式呼叫。
- 回撥函式方式
new ffmpeg('/path/to/your_movie.avi',function (err,video) {
if (!err) {
console.log('The video is ready to be processed');
} else {
console.log('Error: ' + err);
}
});
複製程式碼
- Promise方式
var process = new ffmpeg('/path/to/your_movie.avi');
process.then(function (video) {
console.log('The video is ready to be processed');
},function (err) {
console.log('Error: ' + err);
});
複製程式碼
二.Video 物件
video 物件屬性
每次建立新例項時,此庫都會提供一個新物件來檢索視訊資訊,ffmpeg 配置以及進行必要轉換的所有方法:
var process = new ffmpeg('/path/to/your_movie.avi');
process.then(function (video) {
console.log(video.metadata); // Video metadata
console.log(video.metadata.duration.seconds) // Video 的時長
console.log(video.info_configuration); // FFmpeg configuration
},function (err) {
console.log('Error: ' + err);
});
複製程式碼
video物件方法
video物件預設一組方法,可以獨立於預設配置進行獨立操作。
- video.fnExtractSoundToMP3(destionationFileName,callback) 這個方法會把視訊的音訊流提取為mp3檔案。
引數:
- destionationFileName:要匯出的檔案的完整路徑:
/path/to/your_audio_file.mp3
- callback: (可選)如果在程式結束時指定,它將返回新音訊檔案的路徑:
function (error,file)
例:
var process = new ffmpeg('/path/to/your_movie.avi');
process.then(function (video) {
// Callback mode
video.fnExtractSoundToMP3('/path/to/your_audio_file.mp3',function (error,file) {
if (!error)
console.log('Audio file: ' + file);
});
},function (err) {
console.log('Error: ' + err);
});
複製程式碼
-
video.fnExtractFrameToJPG(destinationFolder,settings,callback) 這個方法就是幫助實現這次需求的主要方法啦,它能擷取視訊的一個或多個幀,返回給我們一個影象陣列。
引數:
-
destinationFolder:生成的幀的目標資料夾
/path/to/you_file
-
setting:( 可選)更改預設設定的設定:
{
start_time: number,// 開始的時間,不太支援
duration_time: number,// 持續的時間
frame_rate: number,// 每秒的幀數
keep_aspect_ratio: false,// 保持寬高比
size: number,// 擷取圖片的尺寸 不太支援
number: number,// 要擷取的幀數
every_n_frames: number,// 間隔幾幀擷取
every_n_seconds: number,// 間隔幾秒擷取,不太支援
every_n_percentage: number,// 間隔百分比擷取,不太支援
keep_pixel_aspect_ratio: true,// Mantain the original pixel video aspect ratio
padding_color: 'black',// Padding color
file_name: null,}
複製程式碼
- callback: (可選)如果在程式結束時指定將返回建立的幀的路徑列表:
function (error,file)
例:
video.fnExtractFrameToJPG('/path/to/save_your_frames',{
frame_rate : 1,number : 5,file_name : 'my_frame_%t_%s'
},files) {
if (!error)
console.log('Frames: ' + files);
});
複製程式碼
-
video.fnAddWatermark(watermarkPath,newFilepath,settings,callback 這個方法負責為正在開發的視訊新增水印。您可以指定影象位置的確切位置。
引數:
-
watermarkPath: 儲存影象的完整路徑
/path/to/retrieve/watermark_file.png
-
newFilepath: (可選)新視訊的名稱。如果未指定,將由該函式建立.
/path/to/save/your_file_video.mp4
-
settings: (可選)更改預設設定的設定.
{
position: "SW",// Position: NE NC NW SE SC SW C CE CW
margin_nord: null,// Margin nord
margin_sud: null,// Margin sud
margin_east: null,// Margin east
margin_west: null,// Margin west
};
複製程式碼
-
callback: (可選)如果在流程結束時指定,它將返回包含水印的新視訊的路徑.
function (error,file)
例:
video.fnAddWatermark('/path/to/retrieve/watermark_file.png','/path/to/save/your_file_video.mp4',{
position : 'SE'
},file) {
if (!error)
console.log('New video file: ' + file);
});
複製程式碼
- 其他方法見npmffmpeg。