ffmpeg 常用命令


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

#獲取視頻圖片 (-ss 表示獲取視頻第40秒處的圖片)
ffmpeg -i bbb.mp4 -frames:v 1 -ss 40 -f image2 bbb.jpg

#改變視頻寬高,將輸入的1920x1080縮小到960x540輸出
#ps: 如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比
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: 輸出的文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM