1. 程式人生 > >【FFMpeg視訊開發與應用基礎】一、使用FFmpeg命令列工具和批處理指令碼進行簡單的音視訊檔案編輯

【FFMpeg視訊開發與應用基礎】一、使用FFmpeg命令列工具和批處理指令碼進行簡單的音視訊檔案編輯

《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK

1、基本介紹

對於每一個從事音視訊技術開發的工程師,想必沒有一個人對FFmpeg這個名稱感到陌生。FFmpeg是一套非常知名的音視訊處理的開源工具,它包含了開發完成的工具軟體、封裝好的函式庫以及原始碼供我們按需使用。FFmpeg提供了非常強大的功能,可以完成音視訊的編碼、解碼、轉碼、視訊採集、後處理(抓圖、水印、封裝/解封裝、格式轉換等),還有流媒體服務等諸多功能,可以說涵蓋了音視訊開發中絕大多數的領域。原生的FFmpeg是在Linux環境下開發的,但是通過各種方法(比如交叉編譯等)可以使它執行在多種平臺環境上,具有比較好的可移植性。

FFmpeg專案的官方網址為:https://ffmpeg.org/。在它的官網上我們可以找到許多非常有用的內容,如專案的簡介、版本更新日誌、庫和原始碼的地址、使用文件等資訊。官方的使用文件是我們在開發時必不可少的資訊來源,其重要性不言而喻。除了官方網站以外,我們下載的FFmpeg的程式包中也有使用參考文件的離線版本。

2、FFmpeg組成

構成FFmpeg主要有三個部分,第一部分是四個作用不同的工具軟體,分別是:ffmpeg.exe,ffplay.exe,ffserver.exe和ffprobe.exe。

  • ffmpeg.exe:音視訊轉碼、轉換器
  • ffplay.exe:簡單的音視訊播放器
  • ffserver.exe:流媒體伺服器
  • ffprobe.exe:簡單的多媒體碼流分析器

第二部分是可以供開發者使用的SDK,為各個不同平臺編譯完成的庫。如果說上面的四個工具軟體都是完整成品形式的玩具,那麼這些庫就相當於樂高積木一樣,我們可以根據自己的需求使用這些庫開發自己的應用程式。這些庫有:

  • libavcodec:包含音視訊編碼器和解碼器
  • libavutil:包含多媒體應用常用的簡化程式設計的工具,如隨機數生成器、資料結構、數學函式等功能
  • libavformat:包含多種多媒體容器格式的封裝、解封裝工具
  • libavfilter:包含多媒體處理常用的濾鏡功能
  • libavdevice:用於音視訊資料採集和渲染等功能的裝置相關
  • libswscale:用於影象縮放和色彩空間和畫素格式轉換功能
  • libswresample:用於音訊重取樣和格式轉換等功能

第三部分是整個工程的原始碼,無論是編譯出來的可執行程式還是SDK,都是由這些原始碼編譯出來的。FFmpeg的原始碼由C語言實現,主要在Linux平臺上進行開發。FFmpeg不是一個孤立的工程,它還存在多個依賴的第三方工程來增強它自身的功能。在當前這一系列的博文/視訊中,我們暫時不會涉及太多原始碼相關的內容,主要以FFmpeg的工具和SDK的呼叫為主。到下一系列我們將專門研究如何編譯原始碼並根據原始碼來進行二次開發。

3、FFMpeg工具的下載和使用

(1)FFmpeg工具的下載:

在官網上我們可以找到”Download”頁面,該頁上可以下載FFmpeg的工具、庫和原始碼等。在選擇”Windows Packages”下的Windows Builds後,會跳轉到Windows版本的下載頁面:

在下載頁面上,我們可以看到,對於32位和64位版本,分別提供了三種不同的模式:static、shared和dev

  • static: 該版本提供了靜態版本的FFmpeg工具,將依賴的庫生成在了最終的可執行檔案中;作為工具而言此版本就可以滿足我們的需求;
  • share: 該版本的工具包括可執行檔案和dll,程式執行過程必須依賴於提供的dll檔案;
  • dev: 提供了庫的標頭檔案和dll的引導庫;

(2)ffplay.exe的使用

ffplay是一個極為簡單的音視訊媒體播放器。ffplay.exe使用了ffmpeg庫和SDL庫開發成的,可以用作FFmpeg API的測試工具。
ffplay的使用方法,最簡單的是直接按照預設格式播放某一個音視訊檔案或流:

ffplay.exe  -i ../video/IMG_0886.MOV

除此之外,ffplay還支援傳入各種引數來控制播放行為。比較常用的引數有:

  • -i input_file:輸入檔名
  • -x width -y height:控制播放視窗的寬高
  • -t duration:控制播放的時長
  • -window_title title:播放視窗的標題,預設為輸入檔名
  • -showmode mode:設定顯示模式,0:顯示視訊;1:顯示音訊波形;2:顯示音訊頻譜
  • -autoexit:設定視訊播放完成後自動退出

(3)ffprobe的使用

ffprobe可以提供簡單的音視訊檔案分析功能。最簡單的方法同ffplay類似:

ffprobe.exe  -i ../video/IMG_0886.MOV

分析完成後,ffprobe會顯示音視訊檔案中包含的每個碼流的資訊,包括編碼格式、畫素解析度、位元速率、幀率等資訊:

ffprobe

(4)ffmpeg的使用

ffmpeg.exe可謂是整個工程的核心所在,它的主要功能是完成音視訊各種各樣的轉換操作。
視訊轉碼:ffmpeg.exe可以將視訊檔案由原格式轉換為其他格式,如從avi轉為mp4等:

ffmpeg -i ../video/IMG_0886.MOV ../video/output_mpeg4_mp3.avi 

這裡,ffmpeg預設將視訊編碼格式選擇為mpeg4,音訊轉碼格式為mp3。如果我們希望保留原始編碼,需要增加引數-c copy,表明不做任何轉碼操作:

ffmpeg -i ../video/IMG_0886.MOV -c copy ../video/output_copy.avi

如果我們希望將視訊轉換為其他編碼格式,則需要在引數中指定目標格式-c:v libx265或-vcodec libx265。ffmpeg支援的所有編碼器格式可以通過以下命令檢視:

ffmpeg.exe -encoders

實際操作:

ffmpeg -i ../video/IMG_0886.MOV -c:v mjpeg  ../video/output_mjpeg.avi

視訊解封裝:ffmpeg可以將視訊中的音訊和視訊流分別提取出來。需要在命令列中新增引數-an和-vn,分別表示遮蔽音訊和視訊流:

@REM 提取視訊流
ffmpeg -i ../video/IMG_0886.MOV -c:v copy -an ../video/IMG_0886_v.MOV
@REM 提取音訊流
ffmpeg -i ../video/IMG_0886.MOV -c:a copy -vn ../video/IMG_0886_a.aac

視訊擷取:使用ffmpeg命令並指定引數-ss和-t,分別表示擷取開始時刻和擷取時長

@REM 視訊擷取
ffmpeg -ss 5 -t 5 -i ../video/IMG_0886.MOV -c copy ../video/IMG_0886_cut.MOV