前言
FFmpeg一般使用官方打包好的命令行程序, 也可以使用源碼集成到自己的程序中,這種方式要求更高.這篇文章主要收錄命令行下的使用方法
使用方式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmpeg -i [輸入文件名] [參數選項] -f [格式] [輸出文件]
參數選項:
先總結一下經常使用的參數
-an: 去掉音頻
-vn: 去掉視頻
-acodec: 設定音頻的編碼器,未設定時則使用與輸入流相同的編解碼器。音頻解復用在一般后面加copy表示拷貝
-vcodec: 設定視頻的編碼器,未設定時則使用與輸入流相同的編解碼器,視頻解復用一般后面加copy表示拷貝
–f: 輸出格式(視頻轉碼)
-bf: B幀數目控制
-g: 關鍵幀間隔控制(視頻跳轉需要關鍵幀)
-s: 設定畫面的寬和高,分辨率控制(352*278)
-i: 設定輸入流
-ss: 指定開始時間(0:0:05)
-t: 指定持續時間(0:05)
-b: 設定視頻流量,默認是200Kbit/s
-aspect: 設定畫面的比例
-ar: 設定音頻采樣率
-ac: 設定聲音的Channel數
-r: 提取圖像頻率(用於視頻截圖)
-c:v: 輸出視頻格式
-c:a: 輸出音頻格式
-y: 輸出時覆蓋輸出目錄已存在的同名文件
使用方式
不精確裁剪視頻
# -ss 指定從什么時間開始
# -t 指定需要截取多長時間
# -i 指定輸入文件
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
精確時間裁剪視頻
- 全部幀都轉換為關鍵幀, 將所有的幀的編碼方式轉為幀內編碼
#舊版本
ffmpeg -i output.mp4 -sameq -intra keyoutput.mp4
#新版本
ffmpeg -i output.mp4 -strict -2 -qscale 0 -intra keyoutput.mp4
- 再開始裁剪視頻
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
合並視頻
//截取從頭開始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
//截取從30s開始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4
//進行視頻的合並
ffmpeg -f concat -i list.txt -c copy concat.mp4
#list.txt
file ./split.mp4
file ./split1.mp4
往流媒體服務器推流
##有打印
ffmpeg -re -i 1.mp4 -vcodec libx264 -acodec aac -f flv rtmp://ip:port/rtmplive/home
ffmpeg -re -stream_loop -1 -loglevel quiet -i 1.flv -vcodec copy -f flv rtmp://ip:port/live/test
修改視頻幀率
// 強制把輸出視頻文件幀率改為 24 fps:-r 幀率
ffmpeg -i input.avi -r 24 output.avi
壓縮視頻
// 改碼率. 這里的700k可以依照個人要求改. 越大,最后視頻就越清晰.
ffmpeg -i ./map.mp4 -b:v 700k map1.mp4
MP4 轉 m3u8 hls ts片段
MP4 轉 ts
ffmpeg -i ./水車.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb ./水車.ts
ts 轉 m3u8
// -segment_time 設定 hls 片段時長,這里設定的3s
// sh-%d.ts 是輸出的ts片段的名稱
ffmpeg -i ./水車.ts -c copy -map 0 -f segment -segment_list ./水車.m3u8 -segment_time 3 sh-%d.ts
MP4 直接轉 m3u8
mp4 直接轉 m3u8 比較慢,沒有把 mp4 先轉成 ts,然后再切割 ts效率高
// -hls_time 設定 hls 片段時長,這里設定的 6s
ffmpeg -i ./水車.mp4 -c:v libx264 -hls_time 6 -hls_list_size 0 -c:a aac -strict -2 -f hls ./index.m3u8
合並視頻和音頻
使用的條件是:視頻文件中沒有音頻
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
video.mp4,audio.wav分別是要合並的視頻和音頻,output.mp4是合並后輸出的音視頻文件。
合並視頻和音頻
用audio音頻替換video中的音頻
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4
混合兩個視頻的畫面和音頻
ffmpeg -i video.mp4 -i ./aideo.mp4 -c:v copy -c:a copy output.mp4