FFmpeg 是一個專業的多媒體框架,能夠解碼、編碼、轉碼、復用、解復用、流式傳輸、過濾和播放幾乎所有格式的媒體文件。 其核心就是 FFmpeg 程序本身,是一個基於命令行的視頻和音頻處理工具,多用於視頻轉碼、基礎編輯(修剪和合併)、視頻縮放、後期效果製作等場景。 這裡通過一些示例簡單地介紹下 ffmpeg 命令的基本使用。
一、獲取詳細信息
ffmpeg -i <inputfile> -hide_banner 其中 -hide_banner 選項用於在輸出文件的詳細信息時省略 ffmpeg 的版本信息和編譯選項等。
$ ffmpeg -i bbb.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bbb.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
creation_time : 2013-12-17T16:40:26.000000Z
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
composer : Sacha Goedegebure
Duration: 00:10:34.53, start: 0.000000, bitrate: 8487 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 3840x2160 [SAR 1:1 DAR 16:9], 8002 kb/s, 60 fps, 60 tbr, 60k tbn, 120 tbc (default)
Metadata:
creation_time : 2013-12-17T16:40:26.000000Z
handler_name : GPAC ISO Video Handler
Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2013-12-17T16:40:28.000000Z
handler_name : GPAC ISO Audio Handler
Stream #0:2(und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 320 kb/s (default)
Metadata:
creation_time : 2013-12-17T16:40:28.000000Z
handler_name : GPAC ISO Audio Handler
Side data:
audio service type: main
At least one output file must be specified
二、格式轉換
ffmpeg -i <inputfile> <outputfile>
FFmpeg 是一個強大的音頻和視頻格式轉換器,幾乎支持當前所有常用的格式,如: $ ffmpeg -i input.avi output.mp4
或者經常需要用到的,將視頻文件轉為 GIF 動圖: $ ffmpeg -i input.mp4 output.gif
如果在格式轉換時需要保留源視頻的質量,可以添加上 -qscale 0 選項(-qscale 的值越低,輸出視頻的質量越高): $ ffmpeg -i input.webm -qscale 0 output.mp4
可以使用 -formats 選項列出 ffmpeg 命令支持的所有格式(很長很長的一個列表。。。):
$ ffmpeg -formats -hide_banner
File formats:
D. = Demuxing supported
.E = Muxing supported
--
D 3dostr 3DO STR
E 3g2 3GP2 (3GPP2 file format)
E 3gp 3GP (3GPP file format)
D 4xm 4X Technologies
E a64 a64 - video for Commodore 64
D aa Audible AA format files
D aac raw ADTS AAC (Advanced Audio Coding)
DE ac3 raw AC-3
D acm Interplay ACM
D act ACT Voice file format
D adf Artworx Data Format
D adp ADP
D ads Sony PS2 ADS
E adts ADTS AAC (Advanced Audio Coding)
DE adx CRI ADX
D aea MD STUDIO audio
D afc AFC
DE aiff Audio IFF
D aix CRI AIX
DE alaw PCM A-law
D alias_pix Alias/Wavefront PIX image
DE amr 3GPP AMR
D amrnb raw AMR-NB
D amrwb raw AMR-WB
D anm Deluxe Paint Animation
D apc CRYO APC
D ape Monkey's Audio
...
三、指定編碼
可以通過 -c 選項手動指定輸出文件的編碼,如: $ ffmpeg -i input.mp4 -c:v vp9 -c:a libvorbis output.mkv 其中 -c:v 用於指定視頻編碼,-c:a 指定音頻編碼
PS:視頻文件的後綴如 mp4、mkv、avi 等只是表示用來裝載媒體流的「容器」類型,而編碼時使用的編碼方式則另需指定。 當然很多時候 ffmpeg 會根據輸出文件的後綴自行選擇默認的編碼方式,無需手動指定。
只改變視頻或者音頻流的編碼
可以在指定編碼時,只改變視頻或者音頻編碼中的一項,另一項則保持原來的格式: $ ffmpeg -i input.webm -c:v copy -c:a flac output.mkv -c:v copy 表示複製輸入文件中的視頻流到輸出文件,不重新進行編碼
只改變文件後綴
即輸入文件中的視頻流和音頻流同時複製到輸出文件,只改變文件後綴: $ ffmpeg -i input.webm -c:av copy output.mkv
編碼列表
查看 FFmpeg 支持的所有音視頻編碼格式(又一個很長的列表。。。):
$ ffmpeg -codecs -hide_banner
Codecs:
D..... = Decoding supported
.E.... = Encoding supported
..V... = Video codec
..A... = Audio codec
..S... = Subtitle codec
...I.. = Intra frame-only codec
....L. = Lossy compression
.....S = Lossless compression
-------
...
DEV.L. flv1 FLV / Sorenson Spark / Sorenson H.263 (Flash Video) (decoders: flv ) (encoders: flv )
D.V..S fmvc FM Screen Capture Codec
D.VI.S fraps Fraps
D.VI.S frwu Forward Uncompressed
D.V.L. g2m Go2Meeting
D.V.L. gdv Gremlin Digital Video
DEV..S gif GIF (Graphics Interchange Format)
DEV.L. h261 H.261
DEV.L. h263 H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2
D.V.L. h263i Intel H.263
DEV.L. h263p H.263+ / H.263-1998 / H.263 version 2
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders: libx264 libx264rgb h264_amf h264_nvenc h264_qsv nvenc nvenc_h264 )
DEVIL. hap Vidvox Hap
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv )
...
四、視頻壓縮
編碼與比特率
有些時候,基於磁盤空間和網絡傳輸的考慮,需要對視頻文件進行壓縮處理。其中一種方法就是改變視頻的比特率。 在某些情況下,比特率的適當縮減對視頻的觀看效果並不會產生太大的影響(人眼察覺的範圍內)。 當然編碼的選擇也會對輸出文件的大小產生一定的影響,示例如下:
$ ffmpeg -i input.webm -c:a copy -c:v vp9 -b:v 1M output.mkv -b:v 用於指定視頻的比特率。
幀率
另一種方式就是改變視頻文件的幀率,也就是人們常常提到的FPS。
$ ffmpeg -i input.webm -c:a copy -c:v vp9 -r 30 output.mkv -r 30 選項用於指定輸出視頻的幀率為 30 FPS。
分辨率
視頻的分辨率也會影響文件的大小,可以使用 -s 選項指定輸出文件的分辨率。當然,視頻的畫幅大小也會產生相應的變化:
$ ffmpeg -i input.mkv -c:a copy -s hd720 output.mkv 或 $ ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv
五、提取音頻
通過格式轉換,FFmpeg 可以直接將視頻文件轉為音頻文件,只需要指定輸出文件的格式為 .mp3 或 .ogg 等。如: $ ffmpeg -i input.mp4 output.mp3
同時,也可以在轉換時指定音頻的格式選項: $ ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
其中: -vn :指定輸出文件中禁用視頻 -ar :指定輸出文件中音頻的採樣率 -ac:指定音頻的通道數 -ab:指定音頻的比特率 -f:指定輸出文件的格式
六、常用實用命令集錦
調整分辨率
將某視頻文件的分辨率改為 1280x720: $ ffmpeg -i input.mp4 -filter:v scale=1280:720 output.mp4 或者: $ ffmpeg -i input.mp4 -s 1280x720 output.mp4
壓縮視頻文件
$ ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4
也可以添加如下選項同時對音頻流進行壓縮: -c:a aac -strict -2 -b:a 128k
移除音頻
$ ffmpeg -i input.mp4 -an output.mp4 -an 選項表示在輸出文件中禁用音頻
提取圖片
$ ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
其中各選項的含義: -r :設置幀率,即每秒有多少幀畫面被提取到圖片中。默認為 25 -f :指定輸出的格式。本例中為圖片(image2) -image-%2d.png :指定提取出的圖片的命名方式。本例中最終的命名為 image-01.png、image-02.png 等。如使用 image-%3d.png ,則最終的命名為 image-001.png、imag-002.png 等
裁剪視頻
即截取指定範圍內的視頻畫面,裁切掉多餘的部分: $ ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
其中 crop=w:h:x:y 用於指定「裁剪框」的大小和位置。 w 表示裁剪部分的寬度(默認為源視頻的寬度 iw); h 表示裁剪部分的高度(默認為源視頻的高度 ih; x 表示 x 軸上裁剪的起始位置(最左邊為 0,默認為源視頻的中間位置); y 表示 y 軸上裁剪的起始位置(最頂部為 0,默認為源視頻的中間位置)。
改變視頻比例
視頻比例即視頻畫幅的長寬比,也就是通常所說的 4:3 和 16:9 等。 $ ffmpeg -i input.mp4 -aspect 16:9 output.mp4
設置音頻封面
即創建以一張靜止的圖片為畫面的視頻。
$ ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -shortest output.mp4 其中的選項和參數可以根據需求自行修改和省略。
截取視頻片段
$ ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 60 output.mp4 截取視頻中從第 50 秒開始,持續時間為一分鐘的視頻片段。
其中 -ss 用於指定視頻片段的開始時間; -t 指定視頻片段的持續時間,單位都為秒。
也可以使用如下方式: $ ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3
以上命令也適用於音頻文件。
視頻分割
$ ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4 將輸入的視頻文件分割為兩段,第一段為從最開始到第 30 秒;第二段為第 30 秒到視頻結束。 其中 -t 00:00:30 前面省略了 -ss 00:00:00; -ss 00:00:30 後面省略了 -t 剩餘時間。
有點類似於截取多個連續的視頻片段。
視頻合併
首先創建包含各媒體文件路徑列表的文本文件 join.txt :
file '~/myvideos/part1.mp4'
file '~/myvideos/part2.mp4'
file '~/myvideos/part3.mp4'
使用 -f concat 選項對多個視頻進行合併: $ ffmpeg -f concat -i join.txt -c copy output.mp4
添加字幕文件
$ ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
改變視頻播放速度(音頻不受影響)
$ ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
上述命令會加快視頻畫面的播放速度,音頻播放速度不變。
如果想放慢視頻畫面的切換速度,可以相應地將 setpts=0.5*PTS 中的 0.5 改為大於 1 的數值。
Padding
即寬銀幕視頻中上下的兩道「黑邊」,可以使用 FFmpeg 命令添加類似的效果: $ ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" output.mp4
該效果由 -vf 選項的 pad 參數指定,可以根據情況自行修改。
從圖片創建視頻
$ ffmpeg -framerate 1 -i img%02d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 把當前目錄下的多張圖片(名字為 img01.jpg、img02.jpg 的形式)組合為一個視頻文件,效果類似於自動播放的 PPT。 每秒切換一張圖片。
$ ffmpeg -framerate 30 -i img%02d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4 也是將當前目錄下的多張圖片組合成一個完整的視頻,該視頻幀率為 30 FPS。 每幀切換一張圖片。