<div class="below-title-meta">
<div class="adt">
By <span class="vcard author">
<span class="fn"><a href="https://eyehere.net/author/xishui/" title="由xishui發佈" rel="author">xishui</a></span>
</span>
<span class="meta-sep">|</span>
<span class="date updated">2019/07/25</span>
</div>
<div class="adt-comment">
<a class="link-comments" href="https://eyehere.net/2019/the-complete-guide-for-using-ffmpeg-in-linux/#comments">5 Comments</a>
</div>
</div><!-- below title meta end -->
</header><!-- .entry-header -->
<div class="entry-content">
在嘗試ffmpeg的時候發現一片很好的文章 https://itsfoss.com/ffmpeg/,做一個筆記。
ffmpeg 是一個處理媒體文件的命令行工具 (command line based) 。它是一個擁有非常多功能的框架,並且因爲他是開源的,很多知名的工具如 VLC,YouTube, iTunes 等等,都是再其之上開發出來的。也有許多爲他定製UI的視頻編輯器Linux video editors。
ffmpeg最吸引我的地方就是它可以用非常簡練的方式(通過一兩個命令)完成許多的處理任務,當然,作爲一個強大的工具,他也有很多較爲複雜的使用方式,有些時候甚至可以代替一個完整的視頻處理流程。
在這個ffmpeg教程中,我會告訴你如何安裝ffmpeg,以及各種使用方法,也會講解一些複雜的功能。
下面是這個教程的章節:
我會詳細的說明各個方面,這樣即便你是linux新手也能明白。
我使用的linux是 Ubuntu 18.04, 不過下面的命令應該可以在其他的linux發行版中同樣適用。
說明: 儘管我研究並嘗試了ffmepg的方方面面,但我的日常工作並不包含視頻編輯。所以如果您有更好的建議、技巧或者糾正,請在留言中指出!
讓我們開始吧!
在 Ubuntu 和其他 Linux 系統上安裝 ffmpeg
安裝 ffmpeg 是非常容易的,它是個很流行的程序,所以大多數的linux發行版中您都可以通過包管理器直接安裝。
在 Ubuntu 上安裝 ffmpeg
在 Ubuntu 上,ffmpeg 存在於 “Universe repository”, 所以確保您開啓了enable universe repository,然後更新並安裝ffmpeg。下面就是您可能需要的命令。
sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg
這就OK了,您可以通過下面的命令嘗試一下有沒有正確安裝:
ffmpeg
他會打印出一些ffmpeg的配置和版本信息。
正如上圖所示,安裝的版本是 3.4.4。不過ffmpeg的最新版本應該是4.1。爲了安裝4.x的版本,您需要使用ffmpeg ppa, 您可以自己研究一下……
在 Arch 系的Linux上安裝 ffmpeg
這個也非常簡單,用下面的命令就行:
sudo pacman -S ffmpeg
在 Fedora 系的Linux上安裝 ffmpeg
使用下面的命令就好了:
sudo dnf install ffmpeg
如何使用 ffmpeg: 基礎
ffmpeg 安裝就緒了,我來講述一些使用這個強力工具的基本概念。
0. ffmpeg 命令
使用 ffmpeg 命令 的基本形式是:
ffmpeg [全局參數] {[輸入文件參數] -i 輸入文件地址} ... {[輸出文件參數] 輸出文件地址} ...
要注意的是,所有的參數僅僅對僅接下來的文件有效(下一個文件得把參數再寫一遍)。
所有沒有使用 -i 指定的文件都被認爲是輸出文件。 Ffmpeg 可以接受多個輸入文件並輸出到您指定的位置。你也可以將輸入輸出都指定爲同一個文件名,不過這個時候要在輸出文件前使用用 -y 標記。
Note
你不應該將輸入和輸出混淆,先指定輸入,再指定輸出文件
1. 獲得媒體文件的信息
ffmpeg 最簡單的使用就是用來 顯示文件信息 。不用給輸出,只是簡單的寫:
ffmpeg -i file_name
視頻和音頻文件都可以使用:
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
命令會輸出很多與您文件無關的信息(ffmpeg本身的信息),雖說這個蠻有用的,你可以使用 -hide_banner 來隱藏掉它們:
ffmpeg -i video_file.mp4 -hide_banner
ffmpeg -i audio_file.mp3 -hide_banner
如圖所示,現在命令只顯示你文件相關的信息了(編碼器,數據流等)。
2. 轉換媒體文件
ffmpeg 最讓人稱道常用的恐怕就是你輕而易舉的在不同媒體格式之間進行自由轉換了。你是要指明輸入和輸出文件名就行了, ffmpeg 會從後綴名猜測格式,這個方法同時適用於視頻和音頻文件
下面是一些例子:
ffmpeg -i video_input.mp4 video_output.avi
ffmpeg -i video_input.webm video_output.flv
ffmpeg -i audio_input.mp3 audio_output.ogg
ffmpeg -i audio_input.wav audio_output.flac
你也可以同時指定多個輸出後綴:
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
這樣會同時輸出多個文件.
想看支持的格式,可以用:
ffmpeg -formats
同樣的,你可以使用 -hide_banner 來省略一些程序信息。
你可以在輸出文件前使用 -qscale 0 來保留原始的視頻質量:
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
進一步,你可以指定編碼器,使用 -c:a (音頻) 和 g-c:v (視頻) 來指定編碼器名稱,或者寫 copy 來使用與源文件相同的編碼器:
ffmpeg -i video_input.mp4 -c:v copy -c:a libvorbis video_output.avi
Note: 這樣做會讓文件後綴使人困惑,所以請避免這麼做。
3. 從視頻中抽取音頻
爲了從視頻文件中抽取音頻,直接加一個 -vn 參數就可以了:
ffmpeg -i video.mp4 -vn audio.mp3
這會讓命令複用原有文件的比特率,一般來說,使用 -ab (音頻比特率)來指定編碼比特率是比較好的:
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
一些常見的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。
其他的一些常用的參數比如 -ar (採樣率: 22050, 441000, 48000), -ac (聲道數), -f (音頻格式, 通常會自動識別的). -ab 也可以使用 -b:a 來替代. 比如:
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
4. 讓視頻靜音
和之前的要求類似,我們可以使用 -an 來獲得純視頻(之前是 -vn).
ffmpeg -i video_input.mp4 -an -video_output.mp4
Note: 這個 -an 標記會讓所有的音頻參數無效,因爲最後沒有音頻會產生。
5. 從視頻中提取圖片
這個功能可能對很多人都挺有用,比如你可能有一些幻燈片,你想從裏面提取所有的圖片,那麼下面這個命令就能幫你:
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
我們來解釋一下這個命令:
-r 代表了幀率(一秒內導出多少張圖像,默認25), -f 代表了輸出格式(image2 實際上上 image2 序列的意思)。
最後一個參數 (輸出文件) 有一個有趣的命名:它使用 %3d 來指示輸出的圖片有三位數字 (000, 001, 等等.)。你也可以用 %2d (兩位數字) 或者 %4d (4位數字) ,只要你願意,你可以隨便實驗 一下可以怎麼寫!
Note: 同樣也有將圖片轉變爲視頻/幻燈片的方式,下面的高級應用中會講到。
6. 更改視頻分辨率或長寬比
對 ffmpeg 來說又是個簡單的任務,你只需要使用 -s 參數來縮放視頻就行了:
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
同時,你可能需要使用 -c:a 來保證音頻編碼是正確的:
ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
你也可是使用-aspect 來更改長寬比:
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
Note: 在高級應用中還會提到更強大的方法
7. 爲音頻增加封面圖片
有個很棒的方法把音頻變成視頻,全程使用一張圖片(比如專輯封面)。當你想往某個網站上傳音頻,但那個網站又僅接受視頻(比如YouTube, Facebook等)的情況下會非常有用。
下面是例子:
ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
只要改一下編碼設置 (-c:v 是 視頻編碼, -c:a 是音頻編碼) 和文件的名稱就能用了。
Note: 如果你使用一個較新的ffmpeg版本(4.x),你就可以不指定 -strict experimental
8. 爲視頻增加字幕
另一個常見又很容易實現的要求是給視頻增加字母,比如一部外文電源,使用下面的命令:
ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
當然,你可以指定自己的編碼器和任何其他的音頻視頻參數。你可以閱讀這篇文章來了解字幕相關內容 editing subtitles in Linux 。
9. 壓縮媒體文件
壓縮文件可以極大減少文件的體積,節約存儲空間,這對於文件傳輸尤爲重要。通過ffmepg,有好幾個方法來壓縮文件體積。
Note: 文件壓縮的太厲害會讓文件質量顯著降低。
首先,對於音頻文件,可以通過降低比特率(使用 -b:a 或 -ab):
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3 ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
再次重申,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大,文件所需要的體積就越大。
對於視頻文件,選項就多了,一個簡單的方法是通過降低視頻比特率 (通過 -b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
Note: 視頻的比特率和音頻是不同的(一般要大得多)。
你也可以使用 -crf 參數 (恆定質量因子). 較小的crf 意味着較大的碼率。同時使用 libx264 編碼器也有助於減小文件體積。這裏有個例子,壓縮的不錯,質量也不會顯著變化:
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
crf 設置爲20 到 30 是最常見的,不過您也可以嘗試一些其他的值。
降低幀率在有些情況下也能有效(不過這往往讓視頻看起來很卡):
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 指示了幀率 (這裏是 24)。
你還可以通過壓縮音頻來降低視頻文件的體積,比如設置爲立體聲或者降低比特率:
ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
Note: -strict -2 和 -ac 2 是來處理立體聲部分的。
10. 裁剪媒體文件(基礎)
想要從開頭開始剪輯一部分,使用T -t 參數來指定一個時間:
ffmpeg -i input_video.mp4 -t 5 output_video.mp4
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
這個參數對音頻和視頻都適用,上面兩個命令做了類似的事情:保存一段5s的輸出文件(文件開頭開始算)。上面使用了兩種不同的表示時間的方式,一個單純的數字(描述)或者 HH:MM:SS (小時, 分鐘, 秒). 第二種方式實際上指示了結束時間。
也可以通過 -ss 給出一個開始時間,-to 給出結束時間:
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
可以看到 開始時間 (-ss HH:MM:SS), 持續秒數 (-t duration), 結束時間 (-to HH:MM:SS), 和開始秒數 (-s duration)的用法.
你可以在媒體文件的任何部分使用這些命令。
ffmpeg: 高級使用
現在該開始講述一些高級的特性了(比如截屏等),讓我們開始吧。
1. 分割媒體文件
前面已經講述瞭如何裁剪文件,那麼如何分割媒體文件呢?只需要爲每個輸出文件分別指定開始時間、結束或者持續時間就可以了。
看下面這個例子:
ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4
語法很簡單,爲第一個文件指定了 -t 00:00:30 作爲持續時間(第一個部分是原始文件的前30秒內容),然後指定接下來的所有內容作爲第二個文件(從第一部分的結束時間開始,也就是 00:00:30)。
你可以任意指定多少個部分,嘗試一下吧,這個功能真的很厲害,同時它也適用用音頻文件。
2. 拼接媒體文件
ffmpeg 也可以進行相反的動作:把多個文件合在一起。
爲了實現這一點,你得用自己順手的編輯器來創建一個文本文件。
因爲我喜歡使用終端,所以這裏我用了 touch 和 vim. 文件名無關緊要,這裏我用 touch 命令創建 video_to_join.txt 文件:
touch videos_to_join.txt
現在,使用 vim 編輯它:
vim videos_to_join.txt
你可以使用任何你喜歡的工具,比如nano,gedit等等。
在文件內容中, 輸入您想拼接的文件的完整路徑(文件會按照順序拼合在一起),一行一個文件。確保他們擁有相同的後綴名。下面是我的例子:
/home/ubuntu/Desktop/video_1.mp4
/home/ubuntu/Desktop/video_2.mp4
/home/ubuntu/Desktop/video_3.mp4
保存這個文件,同樣這個方法適用與任何音頻或者視頻文件。
然後使用下面的命令:
ffmpeg -f concat -i join.txt output.mp4
Note: 使用的輸出文件的名稱是 output.mp4, 因爲我的輸入文件都是mp4的 。
這樣,你 videos_to_join.txt 裏的所有文件都會被拼接成一個獨立的文件了。
3. 將圖片轉變爲視頻
這會告訴你如何將圖片變成幻燈片秀,同時也會告訴你如何加上音頻。
首先我建議您將所有的圖片放到一個文件夾下面,我把它們放到了 my_photos 裏,同時圖片的後綴名最好是 .png 或者 .jpg, 不管選那個,他們應該是同一個後綴名,否則ffmpeg可能會工作的不正常,您可以很方便的把 .png 轉變爲 .jpg (或者倒過來也行)。
我們這次轉換的格式 (-f) 應該被設置爲 image2pipe. 你必須使用使用連詞符(–)來指明輸入。 image2pipe 允許你使用管道 (在命令間使用 |)的結果而不是文件作爲ffmpeg的輸入。命令結果便是將所有圖片的內容逐個輸出,還要注意指明視頻編碼器是 copy (-c:v copy) 以正確使用圖片輸入:
cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv
如果你播放這個文件,你可能會覺得只有一部分圖片被加入了,事實上所有的圖片都在,但是ffmpeg 播放它們的時候太快了,默認是23fps,一秒播放了23張圖片。
你應該指定幀率 (-framerate) :
cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv
在這個例子裏,把幀率設置爲1,也就是每幀(每張圖)會顯示1秒。
爲了加一些聲音,可以使用音頻文件作爲輸入 (-i audo_file) 並且設定copy音頻編碼 (-c:a copy). 你可以同時爲音頻和視頻設定編碼器,在輸出文件前設置就可以了。你要計算一下音頻文件的長度和圖片張數,已確定合適的幀率。比如我的音頻文件是22秒,圖片有9張,那麼幀率應該是 9 / 22 大約0.4,所以我這麼輸入命令:
cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
4. 錄製屏幕
通過 ffmpeg 錄製屏幕同樣沒有困難的,將格式(-f) 設定爲x11grab. 他就會抓取你的XSERVER. 輸入的話可以這是屏幕編號(一般都是0:0). 抓取是從左上角開始計算的,可以指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 注意屏幕分辨率硬在輸入之前指定t:
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
按 q 或者 CTRL+C 以結束錄製屏幕。
小技巧:你可以通過命令獲得真實的分辨率而不是寫死一個固定的大小:
-s $(xdpyinfo | grep dimensions | awk '{print $2;}')
完整的命令這麼寫:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
5. 錄製攝像頭
從攝像頭錄製就更簡單了,linux上設備都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:
ffmpeg -i /dev/video0 output.mkv
同樣, q 或者 CTRL+C 來結束錄製。
6. 錄製聲音
Linux上同時是使用 ALSA 和 pulseaudio 來處理聲音的。 ffmpeg 可以錄製兩者,不過我要特別說明 pulseaudio, 因爲 Debian 系列的發行版默認用了它。命令如下:
在 pulseaudio, 你必須強制指定(-f) alsa 然後指定 default 作爲輸入t (-i default):
ffmpeg -f alsa -i default output.mp3
Note: 在你係統音頻設置裏,應該能看到默認的錄音設備。
我經常玩吉他,我平時使用一個專業音頻設備才能錄製聲音,當我發現ffmpeg也可以很輕鬆的錄製的時候頗爲驚訝。
錄製小貼士
對於錄製任務來說,通常都需要指定編碼器以及幀率,之前講過的參數當然也可以用到這裏來!
ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv
有時候不直接錄音,而是在錄屏/錄像的時候給一個音頻文件,那麼可以這麼做:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4
Note: ffmpeg 使用片段錄取,所有有時候非常短的錄製可能不會保存文件。我建議錄地可以稍微長一些(然後後期裁剪),已保證錄製的文件成功寫到磁盤上。
ffmpeg中的過濾器的基本使用
過濾器 是 ffmpeg 中最爲強大的功能。在ffmepg中有數不甚數的過濾器存在,可以滿足各種編輯需要。因爲過濾器實在太多了,這裏只會簡單講述幾個常用的。
使用 過濾的基本結構是:
ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4 ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav
可以指定視頻過濾器 (-vf, -filter:v的簡寫) 和 音頻過濾器 (-af, -filter:a的簡寫). 過濾器的內容寫到雙引號裏面 (“) 並且可以使用逗號(,)連接。你可以使用任意數量的過濾器(我寫了個etc代表更多的,這不是做一個真實的過濾器)。
過濾器設定的通常格式是:
filter=setting_2=value_2:setting_2=value_2
過濾器不同的值使用冒號分割。
你甚至可以在值裏面使用進行數學符號計算。
Note: 參考 ffmpeg 過濾器手冊.查看更多高級用法
這裏舉幾個例子來說明視頻和音頻的過濾器。
1. 視頻縮放
這是個簡單過濾器,設定裏只有 width 和 height:
ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4
我說過你可以使用數學運算來給值:
ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv
很明顯,這個命令讓輸入的尺寸變成了輸入尺寸(in_w, in_h)的1/2.
2. 視頻裁剪
類似縮放,這個設定也有 width 和 height ,另外可以指定裁剪的原點(默認是視頻的中心)
ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv
第二個命令裁剪原點是視頻的中心點(因爲我沒有給x和y座標),第一個命令會從左上角開始裁剪 (x=0:y=0).
這裏也有一個使用數學計算的例子:
ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv
這會把視頻裁剪剩下原大小的3/4/。
3. 視頻旋轉
你可以指定一個弧度,順時針旋轉視頻。爲了讓計算簡單一些,你可以給角度然後乘以 PI/180:
ffmpeg -i input.avi -vf "rotate=90*PI/180"
ffmpeg -i input.mp4 -vf "rotate=PI"
第一個命令將視頻順時針旋轉90°,第二個則是上下顛倒了視頻(翻轉了180°)。
4. 音頻聲道重映射
有的時候,你的音頻只有右耳可以聽到聲音,那麼這個功能就很有用了。你可以讓聲音同時在左右聲道出現:
ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
這將右聲道(1)同時映射到左(0)右(1)兩個聲道(左邊的數字是輸入,右邊的數字是輸出)。
5. 更改音量
你可以將音量大小乘以一個實數(可以是整數也可以不是),你只需要給出那個數大小就行了。
ffmpeg -i input.wav -af "volume=1.5" output.wav
ffmpeg -i input.ogg -af "volume=0.75" output.ogg
第一個將音量變爲1.5倍,第二個則讓音量變成了原來的1/4那麼安靜。
技巧:更改播放速度
這裏會介紹視頻(不影響音頻)和音頻的過濾器。
- 視頻
視頻過濾器是 setpts (PTS = presentation time stamp). 這個參數以一種有趣的方式工作,因爲我們修改的是PTS,所以較大的數值意味着較慢的播放速度,反之亦然:
ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4
第一個命令讓播放速度加倍了,第二個則是讓播放速度降低了一半。
2. 音頻
這裏的過濾器是 atempo. 這裏有個限制,它只接受 0.5(半速) 到 2 (倍速)之間的值。爲了越過這個限制,你可以鏈式使用這個過濾器:
ffmpeg -i input.wav -af "atempo=0.75" output.wav
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3
第一個命令讓音頻速度慢了1/4,第二個則是加速到原來的4(2*2)倍。
Note: 如果想在同一個命令中同時修改視頻和音頻的速度,你得查看一下 filtergraphs.
小結
在這個手冊中,我講述了安裝、基本的使用、高級的使用和一些過濾器的基礎。
我希望這對於一些嘗試使用ffmpeg的人,或者希望使用ffmpeg做很多工作的人來說是個有用的資源,ffmepg真的是個多功能又極其好用的工具。
如果這對您有所幫助,希望您能留言告訴我。感謝您的閱讀,也許以後會講述一些比較高級的過濾器的使用, Enjoy!
<footer class="entry-meta">
<span>Category: <a href="https://eyehere.net/category/%e7%83%82%e7%ac%94%e5%a4%b4/" rel="category tag">爛筆頭</a></span>
<span>標籤:<a href="https://eyehere.net/tag/ffmpeg/" rel="tag">ffmpeg</a></span>
</footer><!-- .entry-meta -->
</article>