1. 程式人生 > 程式設計 >在node中使用ffmpeg外掛

在node中使用ffmpeg外掛

FFmpeg 是一個自由軟體,可以執行音訊和視訊多種格式的錄影、轉換、流功能,包含了 libavcodec——這是一個用於多個專案中音訊和視訊的解碼器庫,以及 libavformat——一個音訊與視訊格式轉換庫。 “FFmpeg”這個單詞中的“FF”指的是“Fast Forward”。ffmpeg外掛提供了一組函式和實用程式來抽象 ffmpeg 的命令列用法。

當你發現,,實際開發中會有各種各樣奇怪的需求,上傳檔案之類的都算是小事情了,從視訊中擷取幀這種,,也只能想辦法實現了 ?。幸好 node 的外掛庫很豐富,ffmpeg 這款外掛就可以滿足我們對視訊操作的一些基本需求,據我簡單分析,外掛應該是呼叫了 node 子程式模組的 excu()方法,直接呼叫了 ffmpeg 軟體的控制檯命令,對於其他外掛沒有提供的方法可以參照這個思路實現。

一.安裝 ffmpeg

  1. 安裝 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

    這個過程也要安裝很多東西,有點久,還可以到官網下載安裝包,不過需要配置,自行谷歌吧。

  1. 安裝外掛 在專案中執行下面 ? 的命令

    npm install ffmpeg

  2. 引入外掛

    var ffmpeg = require('ffmpeg');

  3. 使用外掛建立例項 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物件預設一組方法,可以獨立於預設配置進行獨立操作。

  1. 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);
  });
複製程式碼
  1. 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);
  });
複製程式碼
  1. 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);
  });

複製程式碼
  1. 其他方法見npmffmpeg