ffmpeg的基本使用方法

概述

ffmpeg的官方介紹如下:

A complete, cross-platform solution to record, convert and stream audio and video.

ffmpeg是一種跨平臺的以多樣化的方式處理視頻、音頻的解決方案。

它從磁盤文件、網絡推流、採集設備…等獲取輸入,經過多樣化的處理(比如改變視頻的幀率、碼率、分辨率,轉換格式,提取音頻,截取等)後輸出。

輸入與輸出可以是一個或多個。

處理流程示意圖:

在這裏插入圖片描述
輸入的文件被拆分器拆分(比如一個視頻文件的視頻、音頻、字幕被分開),得到編碼過的數據包,然後解碼,得到解碼後的數據,解碼後的數據被過濾器處理,然後被再次編碼,得到編碼的數據包,再由合成器合成後輸出文件。

以下內容主要是學習了ffmpeg基礎使用後結合自己的實踐,做的一個記錄和梳理。其中借鑑了原文的一些內容。

基礎命令

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

這是官方給的命令行概述,所有的命令都是以此爲模版,通過填充參數構成的。

下文用到的處理視頻、音頻相關的一些參數,這裏先列出來,後面看到它們的使用就會明白:

-i 設定輸入流 
-f 設定輸出格式 
-ss 開始時間 
-t 時間長度

視頻參數:

-b 設定視頻流量(碼率),默認爲200Kbit/s 
-r 設定幀速率,默認爲25 
-s 設定畫面的寬與高 
-aspect 設定畫面的比例 
-vn 不處理視頻 
-vcodec 設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器 

音頻參數:

-ar 設定採樣率 
-ac 設定聲音的Channel數 
-acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器 
-an 不處理音頻

1. 視頻剪切

ffmpeg -ss 02:19:15 -t 00:01:10 -i input.mp4 -vcodec copy -acodec copy output.mp4

假如我想把電影裏某個精彩片段剪切出來,就用上面這個命令,其中-ss表示開始的時間,-t表示時長,這個命令就是從2時19分15秒開始,剪切出時長大約1分鐘10秒的視頻出來,說大約是因爲ffmpeg對視頻幀的處理機制會使時間不會絕對精確,結果可能會多一兩秒。

2. 提取視頻或者音頻

ffmpeg -i input.mp4 -vcodec copy -an output.mp4

用上面命令可以從一個視頻文件中把視頻部分提取出來,而去掉音頻。

相反地,比如我有一個“曉松奇談”,可是我不想看到他的臉,只想聽聲音,咋辦?

ffmpeg -i 曉松奇談.mp4 -acodec copy -vn output.aac

上面的命令,默認mp4的audio codec是aac,如果不是會出錯,咱可以暴力一點,不管什麼音頻,都轉爲最常見的aac。

ffmpeg -i 曉松奇談.mp4 -acodec aac -vn output.aac

備註:aac是一種在mp3基礎上開發的旨在取代mp3的音頻格式。

3. 視頻格式轉換與視頻編碼格式轉換

視頻格式即容器,就是把編碼器生成的多媒體內容(視頻,音頻,字幕,章節信息等)混合封裝在一起的標準。像avi、mp4、rmvb、mov等都是視頻格式。

視頻編解碼格式是數據按哪種方式編碼壓縮,以便於網絡傳輸和降低帶寬的需要。原始視頻通過攝像頭採集進來以後很龐大,要想在互聯網上進行傳輸就必須要進行壓縮,於是就有了編解碼標準。像MPEG-4、VC-1、H.264等都是編碼標準。

假如一個視頻是avi格式,要改爲mp4格式,可以用下面命令:
ffmpeg -i input.avi output.mp4
假如一個視頻的編碼是MPEG4,要改用H264編碼,可以用下面命令:
ffmpeg -i input.mp4 -vcodec h264 output.mp4
反過來也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

4. 碼率(也叫比特率,bitrate)控制

bitrate = file size / duration

碼率就是數據傳輸時單位時間傳送的數據位數,一般我們用的單位是kbps即千bit每秒。視頻的碼率控制對於在線視頻比較重要,因爲在線視頻需要考慮其能提供的帶寬。

比如一個文件20.8M,時長1分鐘,碼率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音頻的碼率只有固定幾種,比如是128Kbps, 那麼視頻部分的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps。

ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate

  • -b:v主要是控制平均碼率,設置b:v時,同時加上 -bufsize
    -bufsize 用於設置碼率控制緩衝器的大小,設置的好處是,讓整體的碼率更趨近於希望的值,減少波動。(簡單來說,比如1,2的平均值是1.5, 1.49,1.51 也是1.5, 當然是第二種比較好)

    ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

  • -minrate -maxrate就簡單了,在線視頻有時候,希望碼率波動,不要超過一個閾值,可以設置maxrate

    ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

5. 過濾器

  • 改變視頻的分辨率,比如將1920x1080縮小到960x540輸出:

    ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
    如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比

  • 爲視頻添加logo,比如我有這樣一張圖片
    在這裏插入圖片描述
    想要貼到一個視頻上,可以用如下命令:

    ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4

    結果如下:

在這裏插入圖片描述
6. 抓取視頻的一些幀,存爲jpeg圖片

比如一個視頻,我想提取一些幀,存爲圖片,可以用以下命令:
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-r 表示每一秒幾幀

-q:v 表示存儲jpeg的圖像質量,一般2是高質量

這樣ffmpeg會把input.mp4,每隔一秒,存一張圖片下來。假設有60s,那會有60張。60張?這麼多?不要不要。。。。。不要咋辦?? 可以設置開始的時間,和你想要截取的時間。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-ss 表示開始時間

-t 表示要多長時間

這樣ffmpeg會從input.mp4的第20s時間開始,往下10s,即20~30s這10秒鐘之間,每隔1s就抓一幀,總共會抓10幀

7. 驚喜

假如我在網上看到一段視頻想保留下來,可以用下面的命令實現,雖然很簡單,但是我覺得有點像黑科技了(不要濫用),視頻地址通過F12的方式獲取,就不細說了。

ffmpeg -i "https://apd-e34da9b89994bb483210ec97a524cf20.v.......rre.mp4?sdtfrom=v1010&guid=7498e7fceb3a3e6786144867c5e63316&vkey=43......7" output.mp4

參考

ffmpeg官方文檔

ffmpeg基礎使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章