ffmpeg命令格式:
ffmpeg -i [輸入文件名] [參數選項] -f [格式] [輸出文件]
ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
(1) h264: 表示輸出的是h264的視頻裸流
(2) mp4: 表示輸出的是mp4的視頻
(3)mpegts: 表示ts視頻流
主要參數:
-i 設定輸入流
-f 設定輸出格式
-ss 開始時間
-c 指定輸出文件的編碼
視頻參數:
-b 設定視頻流量,默認為200Kbit/s
-r 設定幀速率,默認為25
-s 設定畫面的寬與高
-aspect 設定畫面的比例
-vn 不處理視頻
-vcodec ( -c:v )設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器,一般后面加copy表示拷貝 參數值詳解
音頻參數:
-ar 設定采樣率
-ac 設定聲音的Channel數
-acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器,一般后面加copy表示拷貝 參數值詳解
-an 不處理音頻
基本選項: | |
---|---|
-formats | 輸出所有可用格式 |
-f fmt | 指定格式(音頻或視頻格式) |
-i filename | 指定輸入文件名,在linux下當然也能指定:0.0(屏幕錄制)或攝像頭 |
-y | 覆蓋已有文件 |
-t duration | 記錄時長為t |
-fs limit_size | 設置文件大小上限 |
-ss time_off | 從指定的時間(s)開始, [-]hh:mm:ss[.xxx]的格式也支持 |
-itsoffset time_off | 設置時間偏移(s),該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持 |
-title string | 標題 |
-timestamp time | 時間戳 |
-author string | 作者 |
-copyright string | 版權信息 |
-comment string | 評論 |
-album string | album名 |
-v verbose | 與log相關的 |
-target type | 設置目標文件類型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...) |
-dframes number | 設置要記錄的幀數 |
視頻選項: | |
-b | 指定比特率(bits/s),似乎ffmpeg是自動VBR的,指定了就大概是平均比特率 |
-bitexact | 使用標准比特率 |
-vb | 指定視頻比特率(bits/s) |
-vframes number | 設置轉換多少楨(frame)的視頻 |
-r rate | 幀速率(fps) (可以改,確認非標准楨率會導致音畫不同步,所以只能設定為15或者29.97) |
-s size | 指定分辨率 (320x240) |
-aspect aspect | 設置視頻長寬比(4:3, 16:9 or 1.3333, 1.7777) |
-croptop size | 設置頂部切除尺寸(in pixels) |
-cropbottom size | 設置底部切除尺寸(in pixels) |
-cropleft size | 設置左切除尺寸 (in pixels) |
-cropright size | 設置右切除尺寸 (in pixels) |
-padtop size | 設置頂部補齊尺寸(in pixels) |
-padbottom size | 底補齊(in pixels) |
-padleft size | 左補齊(in pixels) |
-padright size | 右補齊(in pixels) |
-padcolor color | 補齊帶顏色(000000-FFFFFF) |
-vn | 取消視頻 |
-vcodec codec | 強制使用codec編解碼方式('copy' to copy stream) |
-sameq | 使用同樣視頻質量作為源(VBR) |
-pass n | 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率 |
-passlogfile file | 選擇兩遍的紀錄文件名為file |
-newvideo | 在現在的視頻流后面加入新的視頻流 |
高級視頻選項 | |
-pix_fmt format | set pixel format, 'list' as argument shows all the pixel formats supported |
-intra | 僅適用幀內編碼 |
-qscale q | 以<數值>質量為基礎的VBR,取值0.01-255,約小質量越好 |
-loop_input | 設置輸入流的循環數(目前只對圖像有效) |
-loop_output | 設置輸出視頻的循環數,比如輸出gif時設為0表示無限循環 |
-g int | 設置圖像組大小 |
-cutoff int | 設置截止頻率 |
-qmin int | 設定最小質量,與-qmax(設定最大質量)共用,比如-qmin 10 -qmax 31 |
-qmax int | 設定最大質量 |
-qdiff int | 量化標度間最大偏差 (VBR) |
-bf int | 使用frames B 幀,支持mpeg1,mpeg2,mpeg4 |
音頻選項: | |
-ab | 設置比特率(單位:bit/s,也許老版是kb/s)前面-ac設為立體聲時要以一半比特率來設置,比如192kbps的就設成96,轉換 默認比特率都較小,要聽到較高品質聲音的話建議設到160kbps(80)以上。 |
-aframes number | 設置轉換多少楨(frame)的音頻 |
-aq quality | 設置音頻質量 (指定編碼) |
-ar rate | 設置音頻采樣率 (單位:Hz),PSP只認24000 |
-ac channels | 設置聲道數,1就是單聲道,2就是立體聲,轉換單聲道的TVrip可以用1(節省一半容量),高品質的DVDrip就可以用2 |
-an | 取消音頻 |
-acodec codec | 指定音頻編碼('copy' to copy stream) |
-vol volume | 設置錄制音量大小(默認為256) <百分比> ,某些DVDrip的AC3軌音量極小,轉換時可以用這個提高音量,比如200就是原來的2倍 |
-newaudio | 在現在的音頻流后面加入新的音頻流 |
字幕選項: | |
-sn | 取消字幕 |
-scodec codec | 設置字幕編碼('copy' to copy stream) |
-newsubtitle | 在當前字幕后新增 |
-slang code | 設置字幕所用的ISO 639編碼(3個字母) |
Audio/Video 抓取選項: | |
-vc channel | 設置視頻捕獲通道(只對DV1394) |
-tvstd standard | 設置電視標准 NTSC PAL(SECAM) |
1、查看電腦設備:
ffmpeg -list_devices true -f dshow -i dummy
可以看到我的我的電腦有一個HD Camera攝像頭和一個麥克風:麥克風 (Realtek(R) Audio)
如果設備名稱有中文,可能會出現亂碼,想看設備原名,可以去設備管理器中查看,又可以利用第三方工具查看(graphedit),推薦后者。
2、測試攝像頭是否可用
ffplay -f dshow -i video="HD Camera" 或者 ffplay -f vfwcap -i 0
如果成功彈出播放窗口,則代表設備可用,否則可能是設備不可用或者設備被占用
3、查看攝像頭信息
ffmpeg -list_options true -f dshow -i video="HD Camera"
4、查看麥克風信息
ffmpeg -list_options true -f dshow -i audio="麥克風 (Realtek(R) Audio)"
5、本地視頻的推流
把視頻推流至rtmp://192.168.0.108:1935/live/room1
(192.168.0.108:1935為rtmp服務器地址、live為nginx配置節點、room1當做密鑰,推流拉流地址一樣即可播放),語句如下
#使用該方式推流會進行二次編碼,並且原視頻會有一定的畫質損失 ffmpeg.exe -re -i demo.mp4 -f flv rtmp://192.168.0.108:1935/live/room1.flv #推原視頻不失真的方法如下 #-re 使音視頻始終同步 #-vcodec copy -acodec coyp使其不重復編碼,防止視頻音頻失真 ffmpeg -re -i E:\視頻\舞蹈\demo.mp4 -vcodec copy -acodec copy -f flv rtmp://192.168.0.108:1935/live/room1
#只推流音頻
ffmpeg -re -i demo.m4a -vcodec copy -acodec copy -f flv rtmp://192.168.0.108:1935/live/room1
6、攝像頭推流(沒有音頻)
ffmpeg -f dshow -i video="HD Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.0.108:1935/live/room1
7、麥克風推流
ffmpeg -f dshow -i audio="麥克風 (Realtek(R) Audio)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.0.108:1935/live/room1
8、攝像頭與麥克風推流
ffmpeg -f dshow -i video="HD Camera" -f dshow -i audio="麥克風 (Realtek(R) Audio)" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.0.108:1935/live/room1 #或者 ffmpeg -f dshow -i video="HD Camera":audio="麥克風 (Realtek(R) Audio)" -vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.0.108:1935/live/room1
9、其他常用命令
#查看視頻信息 ffmpeg -i video.avi #提取視頻中的音頻(注意此時輸出的格式應該與視頻中的音頻格式保持一致,否則會報錯) ffmpeg -i .\demo.mkv -vn -y -acodec copy output.m4a ffmpeg -i .\demo.mp4 -vn -y -acodec copy output.m4a
提取視頻中的音頻,並指定格式輸出
ffmpeg -i demo.mp4 -acodec mp3 -vn output.mp3
#視頻合並(默認兩個視頻是橫向拼接的,視頻的寬度為兩個視頻的寬度相加,但是只保留了前面一個的音頻)
ffmpeg -i .\demo1.mp4 -i .\demo.mp4 -lavfi hstack output.mp4
#視頻剪切,下面的命令,可以從時間為00:00:15開始,截取5秒鍾的視頻
-ss表示開始切割的時間,-t表示要切多少。上面就是從15秒開始,切5秒鍾出來ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
#ps: 如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比
#獲取視頻圖片 (-ss 表示獲取視頻第40秒處的圖片)
ffmpeg -i bbb.mp4 -frames:v 1 -ss 40 -f image2 bbb.jpg
#改變視頻寬高,將輸入的1920x1080縮小到960x540輸出ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
#視頻編碼格式轉換
#比如一個視頻的編碼是MPEG4,想用H264編碼,咋辦?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
#相反也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
#改變視頻的容器格式為 flv ,視頻和音頻編碼保持原有編碼不變 (copy的作用)
ffmpeg -i aaa3.mp4 -acodec copy -vcodec copy aaa33.flv
#同樣也可以改變視頻格式
ffmpeg -i input.mp4 -vcodec h264 output.mkv
#ffmpeg 逐幀抽取視頻,並保存為圖片(%d 表示從1累加)
ffmpeg -i aaa.MP4 ./aaa/pic_%d.png
#將上條命令保存的圖片轉換為視頻
ffmpeg -f image2 -i pic_%d.png -vcodec libx264 -crf 15 -pix_fmt yuv420p output.mp4
#獲取視頻的第一幀,並保存為圖片
ffmpeg -i .\aaa2.mp4 -frames:v 1 -f image2 aaa.jpg
10、以下命令待驗證
合並視頻和音頻 1、直接合並 視頻文件中沒有音頻 ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4video.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 2、先提取視頻中的音頻,將兩個音頻合並成一個音頻,然后將合並的音頻與視頻進行合並 #獲取視頻中的音頻 ffmpeg -i input.mp4 -vn -y -acodec copy output.aac #去掉視頻中的音頻 ffmpeg -i input.mp4 -an output.mp4 #合並兩個音頻 ffmpeg -i input1.mp3 -i output.aac -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3 #合並音頻和視頻 ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4 3、合並視頻 #橫向合並視頻 ffmpeg -i input1.mp4 -i input2.mp4 -lavfi hstack output.mp4 上面的命令雖然可以合並視頻,兩個視頻可以正常播放,但是只保留了前面一個的音頻。 #合並多個視頻,可以使用下面命令行: ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4 #縱向合並視頻 ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack output.mp4 #網格合並視頻,來源:https://www.zhihu.com/question/300182407 當多個視頻時,還可以合並成網格狀,比如2x2,3x3這種。但是視頻個數不一定需要是偶數,如果是奇數,可以用黑色圖片來占位。 ffmpeg -f lavfi -i color=c=black:s=1280x720 -vframes 1 black.png 該命令將創建一張1280*720的圖片 然后就可以使用下面這個命令來合並成網格視頻了,如果只有三個視頻,可以選擇上面創建的黑色圖片替代。 ffmpeg -i top_left.mp4 -i top_right.mp4 -i bottom_left.mp4 -i bottom_right.mp4 \ -lavfi "[0:v][1:v]hstack[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack" -shortest 2by2grid.mp4 上面創建的是正規的2x2網格視頻。想象一下,現在只有三個視頻,我想把第一個視頻擺放在第一行的中間,然后把第二、三個視頻擺放在第二行。那么就可以使用下面兩個命令了。 ffmpeg -f lavfi -i color=c=black:s=640x720 -vframes 1 black.png ffmpeg -i black.png -i top_center.mp4 -i bottom_left.mp4 -i bottom_right.mp4 -lavfi "[0:v][1:v][0:v]hstack=inputs=3[top];[2:v][3:v]hstack[bottom];[top][bottom]vstack" -shortest 3_videos_2x2_grid.mp4 4、怎么合並兩個視頻並保留兩個視頻中的音頻,注意視頻的分辨率和格式必須一樣。 #合並兩個視頻,只有一個聲音; 縱向合並視頻 ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack output.mp4 #抽取兩個視頻中的音頻,然后合並成一個音頻; ffmpeg -i input_1.mp4 -vn -y -acodec copy output_a1.m4a ffmpeg -i input_2.mp4 -vn -y -acodec copy output_a2.m4a ffmpeg -i output_a1.m4a -i output_a2.m4a -filter_complex amerge -ac 2 -c:a copy -q:a 4 output_a.m4a #將這個音頻替換到之前的合並視頻中; ffmpeg -i video.mp4 -i output_a.m4a -c:v copy -c:a aac -strict experimental output.mp4 5、音頻拼接 #兩個拼接 /usr/local/ffmpeg/bin/ffmpeg -i d1.mp3 -i d2.mp3 -filter_complex '[0:0] [1:0] concat=n=2:v=0:a=1 [a]' -map [a] j5.mp3 #三個拼接 /usr/local/ffmpeg/bin/ffmpeg -i 片頭.wav -i 內容.WAV -i 片尾.wav -filter_complex '[0:0] [1:0] [2:0] concat=n=3:v=0:a=1 [a]' -map [a] 合成.wav #多文件拼接 ffmpeg -f concat -ilist.txt -c copycutebaby.mp3 list.txt文件內容:à按順序連接cutebaby_1.mp3, football.mp3,cutebaby_2.mp3,cutebaby_3.mp3 #拼接不同格式的文件,下面的命令合並了三種不同格式的文件,FFmpeg concat 過濾器會重新編碼它們。注意這是有損壓縮。 [0:0] [0:1] [1:0] [1:1] [2:0] [2:1] 分別表示第一個輸入文件的視頻、音頻、第二個輸入文件的視頻、音頻、第三個輸入文件的視頻、音頻。concat=n=3:v=1:a=1 表示有三個輸入文件,輸出一條視頻流和一條音頻流。[v] [a] 就是得到的視頻流和音頻流的名字,注意在 bash 等 shell 中需要用引號,防止通配符擴展。 ffmpeg -i input1.mp4 -i input2.webm -i input3.avi -filter_complex '[0:0] [0:1] [1:0] [1:1] [2:0] [2:1] concat=n=3:v=1:a=1 [v] [a]' -map '[v]' -map '[a]' <編碼器選項> output.mkv
11、使用ffmpeg從mp4文件中提取視頻流到h264文件中(輸出的文件是一個h264原始流文件,H264原始碼流是由一個個NALU單元組成 每個NALU單元基本就是一幀)
ffmpeg -i demo.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 tmp.h264
注釋:
- -i 2018.mp4: 是輸入的MP4文件
- -codec copy: 從mp4中拷貝
- -bsf: h264_mp4toannexb: 從mp4拷貝到annexB封裝
- -f h264: 采用h264格式
- tmp.264: 輸出的文件