視頻處理工具 FFmpeg 常用實例詳解

2020年12月31日23:55:04 娛樂 1462


FFmpeg 是一個專業的多媒體框架,能夠解碼、編碼、轉碼、復用、解復用、流式傳輸、過濾和播放幾乎所有格式的媒體文件。 其核心就是 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。 每幀切換一張圖片


需要更多音視頻、webrtc、ffmpeg視頻學習資料 文檔請後台私信【音視頻】獲取


視頻處理工具 FFmpeg 常用實例詳解 - 天天要聞


視頻處理工具 FFmpeg 常用實例詳解 - 天天要聞

娛樂分類資訊推薦

鳳凰傳奇突傳消息!官方回應 - 天天要聞

鳳凰傳奇突傳消息!官方回應

近日,網上有傳言稱「鳳凰傳奇7月成都站演唱會將取消」。有網友在問政四川平台上留言諮詢相關問題「成都鳳凰傳奇7月25號到27號演唱會是否已收到取消信息」。對此,龍泉驛區城運中心回復稱:我局已收到您來信中提到的鳳凰傳奇演唱會演出舉辦方取消「鳳凰傳奇「吉祥如意」2025巡迴演唱會-成都站」的申請。此前報道:此前,國...
圖知道|颱風丹娜絲來了,如何應對 - 天天要聞

圖知道|颱風丹娜絲來了,如何應對

7月8日10時,中央氣象台繼續發布颱風藍色預警。今年第4號颱風「丹娜絲」將於7月8日傍晚到夜間在浙江台州至福建寧德一帶沿海再次登陸。颱風來臨前如何應對?颱風過境,如何躲避?一圖速覽。整理/尹希寧 製圖/程璨來源:中國青年報客戶端...
北京取消這一審批,演唱會「鬆綁」了? - 天天要聞

北京取消這一審批,演唱會「鬆綁」了?

「面向社會公眾舉辦的文藝演出、體育比賽、展覽展銷、招聘會、遊園會等大型群眾性活動,無需消防部門審批(備案),無需向消防部門提交證明材料;需要通過外擺攤位開展臨時性促銷售賣、展覽展示、餐飲服務、產品發....
「之」字型奇葩走位?中央氣象台解讀颱風「丹娜絲」 - 天天要聞

「之」字型奇葩走位?中央氣象台解讀颱風「丹娜絲」

颱風「丹娜絲」為什麼會走出一條奇葩的「之」字型路線?背後推手當然還是副熱帶高壓。副高軸線由之前的南北向豎型分布轉為東西向橫型分布,而颱風沿著副高外圍移動,也就由北上轉為西行。實際上夏季的副高位置經常會變化,但因為副高看不見摸不到,大家平時很難感受到,但有了颱風這一「顯形劑」,我們就可以通過它的「奇葩...
一場鬧劇,戳穿湯唯退圈後真實處境,才發現張柏芝不是唯一受害人 - 天天要聞

一場鬧劇,戳穿湯唯退圈後真實處境,才發現張柏芝不是唯一受害人

2007年,一部電影的橫空出世,讓湯唯深刻體會到「一念天堂,一念地獄」。爆紅與封殺接踵而至,28歲的湯唯被打得措手不及。然而,當她退出內娛之後,卻找到了一條新的上坡路。退圈之後,大眾都非常好奇湯唯的現狀。如今,一場鬧劇的發生,暴露了她退圈之後的「真實處境」。原來,她與張柏芝都是受害人!一場鬧劇「現原形」2...
韓國女演員李詩英離婚後發文稱「懷上和前夫的二胎」 - 天天要聞

韓國女演員李詩英離婚後發文稱「懷上和前夫的二胎」

據韓媒8日報道,曾出演《甜蜜家園》的女演員李詩英在社交平台宣布懷上和前夫的二胎,透露在結婚期間曾通過試管嬰兒技術準備二胎,在冷凍胚胎五年保存期限屆滿時自行接受移植,前夫未予以同意,但她選擇將孩子生下來。
《長安的荔枝》IMAX專屬海報發布 7月12、13日點映IMAX大銀幕「嘗鮮」 - 天天要聞

《長安的荔枝》IMAX專屬海報發布 7月12、13日點映IMAX大銀幕「嘗鮮」

備受期待的暑期檔巨制《長安的荔枝》IMAX專屬海報今日發布,影片將於7月25日正式上映,7月12日至13日開啟全國IMAX點映,將通過IMAX大銀幕磅礴再現盛世大唐的萬千氣象,邀觀眾於荔枝成熟的季節沉浸體驗跨越萬水千山,飽覽人間百態的盛唐之旅。 今日發布的《長安的荔枝》IMAX專屬海報刪繁就簡,沃野厚土一馬平川,遠山起伏連...