基本參數
表格1:主要參數
參數 | 說明 |
---|---|
-i | 設定輸入流 |
-f | 設定輸出格式(format) 高于后綴名 |
-ss | 開始時間 |
-t | 時間長度 |
codec | 編解碼 |
表格2:音頻參數
參數 | 說明 |
---|---|
-aframes | 設置要輸出的音頻幀數 |
-f | 音頻幀深度 |
-b:a | 音頻碼率 |
-ar | 設定采樣率 |
-ac | 設定聲音的Channel數 |
-acodec | 設定聲音編解碼器,如果用copy表示原封不動的復制音頻流 |
-an | 不處理音頻 |
-af | 音頻過濾器 |
表格3:視頻參數
參數 | 說明 |
---|---|
-pix_fmt | 提取像素格式 |
-vframes | 設置要輸出的視頻幀數 |
-framerate | 視頻幀率(更多用于與 FFmpeg 的過濾器配合使用,特別是在處理視頻時需要指定幀率的場景。) |
r | 顯式地設置輸出視頻的幀率 |
-b | 設定視頻碼率 |
-s | 指定視頻分辨率->直接處理原始視頻幀或圖像序列 |
video_size | 某些特定的 FFmpeg 過濾器或輸出格式中更常見,尤其是在處理封裝格式(如 MP4、AVI 等)時。 |
-b:v | 視頻碼率 |
-vn | 不處理視頻 |
-aspect | aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777 |
-vcodec | 設定視頻編解碼器,如果用copy表示原封不動的復制視頻流 |
-vf | 視頻過濾器 |
-vbsf | 用于指定視頻比特流過濾器(video bitstream filter)。比特流過濾器主要用于在不進行實際解碼和重新編碼的情況下對視頻數據流進行處理和修改。這可以包括修復損壞的數據流、重新組織數據包、或者執行其他比特流級別的操作。 |
實戰基本參數
提取音視頻
- 保留封裝格式
-
- 音頻
ffmpeg -i .\test.mp4 -acodec copy -vn audio.mp4
- 音頻
注解:只有音頻 視頻顯示波形
-
- 視頻
ffmpeg -i .\test.mp4 -vcodec copy -an video.mp4
- 視頻
無聲音
- 提取視頻()
第一要查看輸入視頻的編解碼協議
第二要查看編解碼協議的編解碼器
ffmpeg -codecs |findstr h264(windows 系統)
一般最右邊括號里面選一個就行 一般第一個
ffmpeg -codecs |grep h264(linuxs系統)
-
- 保留格式(查看編碼)
ffmpeg -i .\test.mp4 -vcodec copy -an test_copy.h264
- 保留格式(查看編碼)
-
- 強制格式(改變編碼)
ffmpeg -i .\test.mp4 -vcodec libx264 -an test.h264
- 強制格式(改變編碼)
-
- 音頻
-
- 保留格式
ffmpeg -i .\test.mp4 -acodec copy -vn test_copy.aac
- 保留格式
-
- 強制格式
ffmpeg -i .\test.mp4 -acodec aac -vn test.aac
- 強制格式
封裝命令
- 保持編碼格式
ffmpeg -i test.mp4 -codec copy test_copy2.ts
- 改變編碼格式
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
-修改幀率
ffmpeg -i test.mp4 -r 15 output2.mp4
-修改視頻碼率
ffmpeg -i test.mp4 -b:v 400k output_bvflv - 修改音頻碼率:
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4 - 修改音視頻碼率:
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
修改視頻分辨率: - ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
修改音頻采樣率: - ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
一個視頻質量由碼率 分辨 幀數決定 音頻為 音頻采樣率(一般由決定音頻幀) 音頻碼率 音頻深度(分辨率) 通道數
提取和播放數據
提取YUV
- 提取3秒數據,分辨率轉為320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
提取RGB
- 提取3秒數據,分辨率轉為320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
提取PCM
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_f16le.pcm
RGB和YUV之間的轉換
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb
播放YUV數據
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
播放RGB數據
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb
播放PCM數據
ffplay -ar 48000 -ac 2 -f s32le 48000_2_s32le.pcm
過濾器參數
裁剪和拼接 (推薦用ts格式)
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
- 拼接(用字符串)
(1)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
(2)ffmpeg -f concat -i list.txt -codec copy out_ts2.mp4
這個txt文件為
file ‘1.ts’
file ‘2.ts’
file ‘3.ts’
對于音視頻參數不一樣的情況
視頻分辨率可以不同,但是編碼格式需要統一。
音頻編碼格式需要統一,音頻參數(采樣率/聲道等)也需要統一。
圖片和視頻
- 單獨幀情況(關于動圖 后綴名你設置)
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
-i:指定輸入文件。
-y:覆蓋輸出文件。
-f image2:指定輸出格式為圖片。
-ss:指定起始時間(00:00:02 表示從視頻的第2秒開始)。
-vframes 1:指定截取1幀。
-s:指定輸出圖片的分辨率(640x360)
-
- (關于動圖 后綴名你設置)
你得額外指定-t -r 后綴名為.git
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 test.gif
- (關于動圖 后綴名你設置)
- 多幀
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
-t 5:指定處理視頻的時長(5秒)(持續時長)。不指定 就是整個視頻
-s 640x360:指定輸出圖片的分辨率。
-r 15:指定幀率(每秒15幀)。
frame%03d.jpg:指定輸出文件名格式,%03d 表示幀編號,從001開始 C語言的風格
- 多幀轉為圖片
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
-f image2:指定輸入格式為圖片序列。
圖片裁剪
基本語法:crop=ow:oh:x:y :keep_aspect
ow(output width):指定輸出視頻的寬度。
oh(output height):指定輸出視頻的高度。
x:裁剪區域左上角的 X 坐標(相對于輸入視頻的左上角)。
y:裁剪區域左上角的 Y 坐標(相對于輸入視頻的左上角)。
keep_aspect 是一個可選參數,用于保持原始視頻的寬高比。
ffmpeg -i input.mp4 -filter:v "crop=640:360:640:360" output.mp4
這個命令會從原始視頻的中間位置(640, 360)開始裁剪出一個 640x360 的視頻區域。
文字水印
ffmpeg -i input.mp4 -vf "drawtext=fontsize=100/fontfile=FreeSerif.ttf/text='hello world'/fontcolor=green:box=1:boxcolor=yellow"
-i input.mp4:指定輸入文件是 input.mp4。
-vf:指定對視頻幀應用的視頻濾鏡(video filter)。
drawtext=fontsize=100:設置文本水印的字體大小為 100。
fontfile=FreeSerif.ttf:指定用于文本水印的字體文件是 FreeSerif.ttf。這個字體文件需要在你的系統中可用,或者提供它的完整路徑。
text=‘hello world’:設置文本水印的內容為 ‘hello world’。
fontcolor=green:設置文本水印的顏色為綠色。
box=1:指定為文本水印繪制一個邊框。
boxcolor=yellow:設置文本水印邊框的顏色為黃色。
圖片水印
ffmpeg -i input.mp4 -vf "movie=logo.png[watermark];[in][watermark] overlay=10:10[out]" output.mp4
-i input.mp4:指定輸入文件為 input.mp4。
-vf:指定對視頻幀應用的視頻濾鏡鏈。
movie=logo.png[watermark]:加載名為 logo.png 的圖片文件,并將其引用名稱設置為 watermark。
[in][watermark] overlay=10:10[out]:
[in]:表示輸入視頻流。
[watermark]:表示加載的圖片水印。
overlay:指定將水印疊加到視頻流上。
=10:10:設置水印的起始位置,x 坐標為 10,y 坐標為 10。
[out]:指定疊加后的視頻流名稱。
ffplay -i input.mp4 -vf " movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*0.7[out]"
movie=logo.png[watermark]:加載 logo.png 圖片文件,并將其引用名稱設置為 watermark。
[in][watermark]overlay=x=mod(50t,main_w):y=abs(sin(t))0.7[out]:
in:表示輸入視頻流。
watermark:表示上面加載的圖片水印。
overlay:將水印圖片疊加到視頻流上。
x=mod(50t,main_w):設置水印的 x 坐標,使其在視頻寬度內按時間 t (以秒為單位)進行周期性移動。mod(50t,main_w) 表示水印每 50 秒移動一個視頻寬度的距離。
y=abs(sin(t))*0.7:設置水印的 y 坐標,使其根據正弦函數 sin(t) 的值在視頻高度的 0.7 倍范圍內上下波動。
out:指定疊加后的輸出視頻流。
- 畫中畫
ffplay -i input.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"
-i input.mp4:指定輸入文件是 input.mp4。
-vf:指定對視頻幀應用的視頻濾鏡鏈(video filtergraph)。
movie=sub_320x240.mp4[sub]:加載名為 sub_320x240.mp4 的視頻文件,并將其引用名稱設置為 sub。這個子視頻將被用作水印或覆蓋層。
[in][sub]overlay=x=20:y=20:將輸入視頻流([in])和子視頻流([sub])進行疊加(overlay)。x=20 和 y=20 參數指定了子視頻在主視頻上的起始位置,即子視頻左上角的 x 坐標為 20,y 坐標為 20。
[out]:指定疊加后的視頻流名稱,用于輸出。