前言
在上一篇博客中我們搭建了FFmpeg的基本環境,這一篇博客我們主要來說一下FFmpeg的各種命令,主要包含一下九大類命令.如下所示.接下來我們就逐一的來說明每一種命令的使用與示例.
FFmpeg命令分類 |
---|
基本信息查詢命令 |
錄制命令 |
播放命令 |
分解/復用命令 |
處理原始數據命令 |
裁剪與合并命令 |
圖片/視頻互轉命令 |
直播相關命令 |
視頻濾鏡命令 |
基本信息查詢命令
常用基本信息查詢命令如下所示.
命令 | 作用 | 命令 | 作用 |
---|---|---|---|
-version | 顯示版本 | -formats | 顯示可用的格式 |
-demuxers | 顯示可用的demuxers | -protocols | 顯示可用的協議 |
-muxers | 顯示可用的muxers | -filters | 顯示可用的過濾器 |
-devices | 顯示可用的設備 | -pix_fmts | 顯示可用的像素點 |
-codecs | 顯示所有編解碼器 | -sample_fmts | 顯示可用的采樣格式 |
-decoders | 顯示可用的解碼器 | -layouts | 顯示channel名稱 |
-encoders | 顯示可用的編碼器 | -colors | 顯示識別的顏色名稱 |
-bsfs | 顯示比特流filter |
例如查詢 可用的解碼器,我們直接使用下面的命令即可.
ffmpeg -decoders
錄制命令
錄制命令也是我們常用的一種命令,這里直接上命令了.
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
各個參數的解釋如下所示.
參數 | 說明 |
---|---|
-f | 指定使用哪個庫來采集數據,avfoundation是iOS的音視頻庫 |
-i | 指定從哪里采集數據,它是一個文件索引號,我們可以通過ffmpeg -f avfoundation -list_devices true -i "" 查詢. |
-r | 指定幀率 |
這里先說明一下查詢文件索引號的命令.
ffmpeg -f avfoundation -list_devices true -i ""
當我們使用上面的命令去查詢avfoundation的所能使用的設備的時候.
[AVFoundation input device @ 0x7fb4cb50f1c0] AVFoundation video devices:
[AVFoundation input device @ 0x7fb4cb50f1c0] [0] FaceTime 高清攝像頭(內建)
[AVFoundation input device @ 0x7fb4cb50f1c0] [1] Capture screen 0
[AVFoundation input device @ 0x7fb4cb50f1c0] AVFoundation audio devices:
[AVFoundation input device @ 0x7fb4cb50f1c0] [0] Built-in Microphone
我們可以看到我的電腦一共有兩個視頻設備和一個音頻設備, 在錄制的時候,我們使用-i 1
的指令就是來指定我們需要錄制桌面,所以我們可以捕捉到桌面的圖像.當然了,我們可以使用-i 0
來開啟電腦的高清攝像頭,來捕捉到我這個逗比,哈哈[手動滑稽]
上面我們可以錄制視頻,我們如何錄制音頻呢?我們在錄制音頻的時候該如何制定我們的設備呢?我們帶著這些疑問接著往下看.錄制音頻的時候,我們整體的命令如下所示.
ffmpeg -f avfoundation -i :0 out.wav
這時候我們發現
-i
指定音頻設備的時候文件索引號前面需要加冒號 :
上面我們看到了如何錄制視頻和音頻,如果我們想同時錄制音視頻該怎么辦呢?我們只需要把上面的兩條命令合并一下即可.整體命令如下所示.
ffmpeg -f avfoundation -i :0 -f avfoundation -i 0 -r 30 out.flv
播放命令
在錄制命令模塊中我們錄制了視頻和音頻,所以我們需要看我們錄制的結果,這時候需要播放命令.播放命令是基于 ffplay 的,這里有個點需要注意,那就是yuv格式的視頻數據是沒有包含幀大小(WxH)的視頻文件.所以我們需要指定幀大小.整體命令如下所示.
ffplay -s 1920x1080 -pix_fmts uyvy422 out.yuv
參數 | 說明 |
---|---|
-s | 設置顯示幀存儲(WxH格式),僅適用于類似原始YUV等沒有包含幀大小(WxH)的視頻. |
-pix_fmts | 設置像素格式.ffplay 默認使用的像素格式yuv420p,但是錄制的是uyvy422. |
上面兩個參數具體指可以參考錄制過程中的打印值.
對于音頻和常見的音視頻,我們可以不加任何的參數直接進行播放,如下所示.
ffplay out.wav
上面我們說到了如何播放音視頻,接下來我們簡單的說一下 ffplay 其他常見的參數.
ffplay參數 | 說明 |
---|---|
-x | 強制顯示寬帶。 |
-y | 強制顯示高度。 |
-s | 幀尺寸 設置顯示幀存儲(WxH格式),僅適用于類似原始YUV等沒有包含幀大小(WxH)的視頻。該參數已經被廢棄,請嘗試用-video_size代替. |
-fs | 以全屏模式啟動。 |
-an | 禁用音頻(不播放聲音) |
-vn | 禁用視頻(不播放視頻) |
-sn | 禁用字幕(不顯示字幕) |
-ss | 根據設置的秒進行定位拖動,注意時間單位:比如'55' 55 seconds, '12:03:45' ,12 hours, 03 minutes and 45 seconds, '23.189' 23.189 second |
-t | 設置播放視頻/音頻長度,時間單位如 -ss選項 |
-bytes | 按字節進行定位拖動。 |
-seek_interval | 自定義左/右鍵定位拖動間隔(以秒為單位),默認值為10秒 |
-nodisp | 關閉圖形化顯示窗口,視頻將不顯示 |
-noborder | 無邊框窗口 |
-volume | 設置起始音量。音量范圍[0 ~100] |
-f | 強制使用設置的格式進行解析。比如-f s16le |
-loop | 設置播放循環次數 |
-showmode | 設置顯示模式,可用的模式值:0 顯示視頻,1 顯示音頻波形,2 顯示音頻頻譜。缺省為0,如果視頻不存在則自動選擇2 |
-vf | 設置視頻濾鏡 |
-af | 設置音頻濾鏡 |
分解/復用命令
上面說到錄制和播放命令兩種命令,這一個模塊我們來說說分解與復用命令.比如一個視頻里面包含著視頻流,音頻流以及其他信息,我們想單獨的抽取視頻或者音頻,這時候我們該怎么辦呢?這時候我們就需要用到我們的分解/復用命令了.
例如我們想把一個視頻格式進行轉換,其實就是一個分解與復用的過程.那么我們就可以如下命令進行操作.
ffmpeg -i input.mp4 -vcodec copy -acodec copy out.mov
參數 | 說明 |
---|---|
-i | 指定需要轉換格式的文件 |
-vcodec | 視頻處理方式 |
-acodec | 音頻處理方式 |
當我們需要單獨抽取音頻或者視頻的時候,我們需要用的操作是這樣的.-vn 和 -an 兩個參數去除視頻和音頻.命令如下所示.
#抽取視頻
ffmpeg -i input.mp4 -vcodec copy -an out.mov
#抽取音頻
ffmpeg -i input.mp4 -acodec copy -vn out.aac
當我們了解基本的分解與復用命令之后,我們就可以做一些比較有趣的事情,例如做一個小咖秀的功能,給一段視頻進行配音.其實就是我們需要抽取出我們的視頻數據,把視頻數據和音頻數據合并在一起即可.
#移除原始的音頻數據
ffmpeg -i input.mp4 -vcodec copy -an out.mp4
#合并新的視頻和音頻數據
ffmpeg -i out.mp4 -i out.aac -vcodec copy -acodec copy result.mp4
處理原始數據命令
有些時候,我們需要提取音視頻文件中的原始數據,例如yuv視頻原始數據和pcm音頻原始數據等等,這時候我們就需要使用到處理原始數據命令了.接下來我們直接來看示例.
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
參數 | 說明 |
---|---|
-i | 指定操作的多媒體文件 |
-an | 移除音頻 |
-c:v rawvideo | 對視頻進行編碼(原始數據格式) |
-pix_fmt | 設置像素格式. |
我們抽取音頻的時候,需要指定 音頻采樣率 ,聲道信息 ,存儲格式 等相關參數.命令如下所示.
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
參數 | 說明 |
---|---|
-i | 指定操作的多媒體文件 |
-vn | 移除視頻 |
-ar | 音頻的采樣率 例如 44100 48000 32000 16000 等 |
-ac | 設置聲道 |
-f | 設置存儲格式 例如這里使用的是s16le |
同時注意的是,在播放的時候也需要注意存儲格式.所以播放命令示例如下所示.
ffplay -f s16le out.pcm
裁剪與合并命令
在日常生活中我們會有對視頻進行裁剪以及對多個視頻進行合并需求,這時候我們就需要使用到裁剪與合并命令了.廢話不多講,我們直接上示例.
ffmpeg -i input.mp4 -ss 00:00:00 -t 3 out.mp4
參數 | 說明 |
---|---|
-i | 指定操作的多媒體文件 |
-ss | 裁剪開始時間 |
-t | 剪切時長,單位秒 |
合并命令和我們以前命令有些不同,為了實現多個視頻的合并,我們需要在一個文件中寫下我們所需要合并的所有的多媒體文件.格式如下所示.
file 'input.mp4'
file 'input2.mp4'
接著我們使用我們的合并命令就行了.命令如下所示.
ffmpeg -f concat -i inputs.txt out.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-f concat | 合并操作 |
圖片/視頻互轉命令
圖片和視頻的互相轉換也是我們日常生活比較常用的功能.我們經常需要去視頻中抽取圖片,也會有把圖片轉換為視頻的需求.這是我們就可以使用FFmpeg來解決這些問題了.
#視頻轉圖片
ffmpeg -i input.mp4 -r 1 -f image2 image-%3d.jpeg
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-f image2 | 指定圖片類型 |
-r | 轉換圖片的幀率,一秒幾張 |
#圖片轉視頻
ffmpeg -i image-%3d.jpeg -r 6 out.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-r | 指定一張圖片所占的幀率 |
直播命令
直播命令我們可能更多的會用于測試,例如使用直播命令推流或者拉流.
#直播推流命令
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/stramName
#直播拉流命令
ffmpeg -i rtmp://server/live/stramName -c copy dump.flv
例如,下面就是可用的示例.
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.m3u8
視頻濾鏡命令
FFmpeg中的視頻濾鏡也是非常的豐富的,我們可以通過以前的命令查詢所有可用的濾鏡信息.
ffmpeg -filters
這里我們只說幾個常見的濾鏡.
- 視頻的裁剪濾鏡
ffmpeg -i input.mp4 -vf crop=in_w-100:in_h-100 -c:v libx264 -c:a copy out.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定視頻濾鏡 |
crop | 濾鏡名稱 |
-c:v | 指定視頻編碼格式 |
-c:a | 指定音頻編碼格式 |
- 視頻的縮放
ffmpeg -i input.mp4 -vf scale=iw/2:-1 scale.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定視頻濾鏡 |
scale | 濾鏡名稱,iw/2表示寬縮小一倍,-1表示高等比例縮小 |
- 添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v] scale=80:80[logo];[0:v][logo]overlay=x=0:y=0" logo.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-vf | 指定視頻濾鏡 |
scale | 圖片寬高信息 |
overlay | 圖片的位置信息 |
- 去除水印
ffmpeg -i logo.mp4 -filter_complex "delogo=x=1:y=1:w=80:h=80:show=1" delogo.mp4
參數 | 說明 |
---|---|
-i | 指定操作的文件 |
-filter_complex | 指定視頻濾鏡 |
delogo | 去除logo濾鏡 |
show | 會暫時是否顯示去除的綠色邊框 |
總結
FFmpeg中的命令多用于腳本的編寫以及測試用途,也可以自己做一些簡單的小工具進行日常的使用.這里就不過多敘述了.下面的博客基本是圍繞FFmpeg代碼編寫進行的,歡迎指導批評.