FFmpeg是一個用於音視頻處理的自由軟件,被普遍用於音視頻開發。FFmpeg功能強大,本文主要介紹如何使用FFmpeg命令行工具進行簡單的視頻處理。css
安裝FFmpeg能夠在官網下載各平臺軟件包或者靜態編譯版本,也可使用包管理工具安裝。html
容器算法
咱們熟悉的mp4
,rmvb
,mkv
,avi
是多媒體容器文件格式(或稱多媒體封裝格式),所謂容器是指將不一樣的數據流(視頻流,音頻流,字幕流等)封裝在一個文件(載體)中。shell
播放時各類流分別進行解碼等處理後,而後輸出到顯示器和音響等設備進行播放。多媒體容器格式不一樣於編碼格式,一個容器中能夠封裝多種編碼格式的媒體流。json
流封裝了實際的媒體數據,如視頻流,音頻流和字幕流等。通常狀況下,流中的數據只能使用一種編碼格式。bash
幀率ide
幀率(frames per second, fps)是每秒畫面刷新的次數,幀率越高視頻越流暢。通常來講30fps就是能夠接受的,60fps則能夠明顯提高交互感和逼真感,可是通常超過75fps通常就不容易察覺到有明顯的流暢度提高了。工具
分辨率oop
分辨率表示畫面的精細程度,一般用像素密度來表示,經常使用的單位爲ppi(像素每英寸)。一般像素密度越高畫面越精細,模糊程度越低。佈局
對於視頻文件而言,像素密度是沒法控制的(由播放器和顯示設備決定)。咱們一般用視頻的像素數來表示它的分辨率如1080x640, 640x320等。
比特率
比特率(bit rate)又稱碼率,表示多媒體流每秒輸出的字節數,單位爲KB/s, Kbps等。一樣的壓縮算法下,比特率越高音視頻的質量越好。
可變碼率(Variable Bitrate, VBR)指的是編碼器的輸出碼率能夠根據輸入源信號的複雜度進行自適應調整,以在輸出質量保持不變的條件下儘量減小數據量。VBR適用於存儲,不太適用流式傳輸。
固定碼率(Constant Bitrate, CBR)指的是編碼器輸出碼率固定,CBR不適合存儲,對於複雜內容可能沒有足夠碼率進行編碼,從而致使質量降低,同時會在簡單內容部分浪費一些碼率。
採樣率
每秒鐘對音頻信號的採樣次數,採樣頻率越高聲音還原度越高,聲音更加天然,單位是赫茲 Hz。
音頻文件通常使用的採樣率是 44.1 kHz,也就是一秒鐘採樣44100次,實驗發現低於這個值就會有較明顯的損失,而高於這個值人的耳朵已經很難分辨,並且增大了數字音頻所佔用的空間。
視頻編碼
視頻流能夠看作圖片的序列,咱們把這個序列中的一張圖片稱爲一幀。若存儲視頻中全部幀則會數據量過大,不便於存儲和傳輸。
所幸統計代表大多數視頻相鄰幀之間的區別並不大,因此對於一段變化不大的視頻,咱們能夠先完整編碼幀A,其後的B幀只須要編碼與A幀不一樣的部分,B幀後的C幀則只編碼與B幀的差別。如此遞推,將一段視頻編碼爲一個序列。
當某個圖像與以前的圖像變化很大沒法參考前面的幀來生成,咱們就結束上一個序列將該幀完整編碼開始一個新的序列。
H264是目前流行的一種視頻編碼算法,它定義了三種幀:完整編碼的I幀,參考I幀生成只包含差別的P幀,以及以及參考先後幀編碼的B幀。
H264採用的核心算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。
一般,咱們也把完整編碼的I幀稱爲關鍵幀。由於解碼非關鍵幀須要解碼其參考的幀,所以在截圖等不須要所有解碼的操做中,常常截取關鍵幀以提高性能。
ffprobe是FFmpeg項目提供的用於分析視頻信息的命令行工具。
隨意下載一個測試視頻testmp4
, 而後終端中輸入指令:
ffprobe -v quiet -print_format json -show_format -show_streams test.mp4
能夠得到json格式輸出的視頻信息:
{ "streams": [ // 文件中包含的流 { "index": 0, // 流的序號 "codec_name": "h264", // 流的編碼格式 "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", // 編碼格式的全名 "profile": "High", "codec_type": "video", // video表示這是一個視頻流 "codec_time_base": "1/60", "codec_tag_string": "avc1", "codec_tag": "0x31637661", "width": 1080, // 視頻寬爲1080像素 "height": 614, // 視頻高爲614像素 "coded_width": 1080, "coded_height": 614, "has_b_frames": 2, "sample_aspect_ratio": "0:1", "display_aspect_ratio": "0:1", "pix_fmt": "yuv420p", "level": 31, "chroma_location": "left", "refs": 1, "is_avc": "true", "nal_length_size": "4", "r_frame_rate": "30/1", // 實際幀率 "avg_frame_rate": "30/1", "time_base": "1/15360", "start_pts": 0, "start_time": "0.000000", "duration_ts": 153093, "duration": "9.966992", // 以秒爲單位的視頻時間 "bit_rate": "2077265", // 視頻的比特率 "bits_per_raw_sample": "8", "nb_frames": "299", "tags": { // 流中的附加信息,其中的字段可能爲空 "rotate": 90, // 視頻旋轉的角度 "language": "und", "handler_name": "VideoHandler" } }, { "index": 1, // 流編號 "codec_name": "aac", // 流的編碼格式 "codec_long_name":