目錄:
1. FFmpeg簡介 FFmpeg編碼流程 FFmpeg混淆概念
2.FFmpeg操作參數
3.FFmpeg常用操作
5. FFmpeg操作參數 [1][2][3]
通過homebrew,在終端安裝FFmpeg:
brew install FFmpeg
在終端輸入:
ffmpeg -h
第一部分:FFmpeg版本、位置、子產品等資訊(可不看)
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.16)
configuration:
--prefix=/usr/local/Cellar/ffmpeg/4.2.2_1
--enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang
--host-cflags='-I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/
Home/include -I/Library/Java/JavaVirtualMachines/adoptopenjdk-13.0.1.jdk/Contents/
Home/include/darwin -fno-stack-check'
--host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray
--enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy
--enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx
--enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma
--enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass
--enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp
--enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Hyper fast Audio and Video encoder
第二部分:FFmpeg用法 [global_options
第三部分:幫助/列印選項
#列印基本選項
-h long -- print more options
第四部分:功能顯示
#顯示版本
-buildconf show build configuration
第五部分:全局選項 [global_options]:(影響整個程式,而不僅僅是一個檔案) (affect whole program instead of just one file:
-loglevel loglevel
第六部分:檔案主選項 [input_file_options] / [output_file_options] #指定格式
-c codec codec name
檔案主選項 -其他:
-re:代表按照時間戳讀取或發送資料,尤其在作為推流工具的時候一定要加上該參數,否則ffpmeg會按照最高速率向流媒體不停的發送資料。
-map:指定輸出檔案的流映射關系。例如:“-map 1:0 -map 1:1”要求按照第二個輸入的檔案的第一個流和第二個流寫入輸出檔案。如果沒有設定此項,則ffpmeg采用預設的映射關系。
-title string 設定标題
-author string 設定作者
-copyright string 設定版權
-comment string 設定評論
-hq 激活高品質設定
-itsoffset offset 設定以秒為基準的時間偏移,該選項影響所有後面的輸入檔案。該偏移被加到輸入檔案的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支援
視訊參數:
set the number of video frames to output
視訊參數-其他:
-bitexact:使用标準比特率。
-vb:指定視訊比特率(bit/s)
-croptop size:設定頂部切除尺寸(in pixels)
-cropleft size:設定左切除尺寸(in pixels)
-cropbottom size:設定地步切除尺寸(in pixels)
-cropright size:設定右切除尺寸(in pixels)
-padtop size:設定頂部補齊尺寸(in pixels)
-padleft size:設定左補齊尺寸(in pixels)
-padbottom size:設定地步補齊尺寸(in pixels)
-padright size:設定右補齊尺寸(in pixels)
-padcolor color:設定補齊顔色
音頻參數:
set the number of audio frames to output
音頻參數-其他
-ab:
設定比特率(bit/s),對于MP3的格式,
想要聽到較高品質的聲音,建議設定160Kbit/s(單聲道80Kbit/s)以上。
字幕參數:
set frame size
進階視訊參數:
-g gop_size 設定圖像組大小
-intra 僅适用幀内編碼
-qscale q 使用固定的視訊量化标度(VBR)
-qmin q 最小視訊量化标度(VBR)
-qmax q 最大視訊量化标度(VBR)
-qdiff q 量化标度間最大偏差 (VBR)
-qblur blur 視訊量化标度柔化(VBR)
-qcomp compression 視訊量化标度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始複雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp偏差
-i_qoffset offset 在p和i幀間的qp偏差
-rc_eq equation 設定碼率控制方程 預設tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設定運動估計的方法 可用方法有 zero phods log x1 epzs(預設) full
-dct_algo algo 設定dct的算法 可用的有 0 FF_DCT_AUTO 預設的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設定idct算法。可用的有 0 FF_IDCT_AUTO 預設的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設定錯誤殘留為n 1 FF_ER_CAREFULL 預設 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設定錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支援mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用于mpeg4
-part 使用資料劃分 僅用于mpeg4
-bug param 繞過沒有被自動監測到編碼器的問題
-strict strictness 跟标準的嚴格性
-aic 使能進階幀内編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不采用交織方法
-interlace 強迫交織法編碼僅對mpeg2和mpeg4有效。當你的輸入是交織的并且你想要保持交織以最小圖像損失的時候采用該選項。可選的方法是不交織,但是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視訊編碼統計到vstats_hhmmss.log
-vhook module 插入視訊處理子產品 module 包括了子產品名和參數,用空格分開
音頻/視訊捕獲選項
-vd device 設定視訊捕獲裝置。比如/dev/video0
-vc channel 設定視訊捕獲通道 DV1394專用
-tvstd standard 設定電視标準 NTSC PAL(SECAM)
-dv1394 設定DV1394捕獲
-av device 設定音頻裝置 比如/dev/dsp
進階選項
-map file:stream 設定輸入流映射
-debug 列印特定調試資訊
-benchmark 為基準測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精确算法 用于編解碼測試
-ps size 設定包大小,以bits為機關
-re 以本地幀頻讀資料,主要用于模拟捕獲裝置
-loop 循環輸入流(隻工作于圖像流,用于ffserver測試)
1.擷取音頻/視訊檔案資訊:
ffmpeg -i input.mp4
2.删除或修改音/視訊的中繼資料資訊:
ffmpeg -i "two.mp4" -map_metadata -1 -y "input.mp4"
#-map_metadata -1 就是清楚檔案的中繼資料,-y 表示不用再次詢問是否操作
ffmpeg -i input.mp4 -metadata artist=benarchen -metadata title="Test 1" output.mp4
#-metadata artist=benarchen 表示設定該資源的作者,-metadata title="Test 1" 是設定标題
3.去除水印(靜态)
"delogo=x=1:y=1:w=100:h=30:show=0" output.mp4
4.去除多水印(靜态)
"D:input.mp4" -vf
2.修改視訊格式:
ffmpeg -i input.mp4 -qscale 0 -y output.mp4
#-qscale 0 參數是為了不影響資源的品質
剪切視訊 對視訊的剪切主要有兩個,去除片頭和去除片尾,FFmpeg 要去除固定時長的片頭非常的簡單,使用下面的指令就可以了:
ffmpeg -ss 00:03:00 -i input.mp4 -t 60 -c:v copy -c:a copy output.mp4
#-ss 00:03:00 表示從 3 分鐘開始截取(也就是去除 3 分鐘的開頭)
#-t 60/-to 60 這裡 -t 和 -to 都是一樣的效果,意思是從截取開始往時間軸截取 60s
#-c:v copy -c:a copy 意思是複制源檔案的編碼格式,這樣會比較快
#如果隻是去除 3 分鐘的片頭可以不用加 -t 或者 -to 指令,如下:
ffmpeg -ss 00:03:00 -i input.mp4 -c:v copy -c:a copy output.mp4
還有一種情況就是在剪掉固定時長片頭的同時也剪掉固定時長的片尾,FFmpeg 官方沒有直接提供這中功能,一種最常用的思路是在 shell 腳本中先用 FFmpeg -i 把檔案的中繼資料資訊保留下來,再從中繼資料資訊中提取出視訊的時長,用視訊的總時長減去要剪掉的開頭時長後結尾時長就是我們需要的實際時長了:
#!/bin/bash
#我這裡要切除的開頭和結尾都是 7 秒
beg=7
end=7
#用 for 循環直接擷取目前目錄下的 mp4、mp3、avi 等檔案循環處理,單個檔案可以去掉 for 循環
for i in (*.mp4,*.mp3,*.avi ); do
#将中繼資料資訊臨時儲存到 tmp.log 檔案中
nohup /usr/local/ffmpeg/bin/ffmpeg -i "$i" > tmp.log
#擷取視訊的時長,格式為 00:00:10,10 (時:分:秒,微妙)
time="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk '{print $2}'|awk -F "," '{print $1}'|xargs`"
echo $time
#求視訊的總時長,先分别求出小時、分、秒的值,這裡不處理微秒,可以忽略
hour="`echo $time |awk -F ":" '{print $1}' `"
min="`echo $time |awk -F ":" '{print $2}' `"
sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
#echo $hour $min $sec
num1=`expr $hour * 3600`
num2=`expr $min * 60`
num3=$sec
#計算出視訊的總時長(秒)
sum=`expr $num1 + $num2 + $num3`
#總時長減去開頭和結尾就是截取後的視訊時長,并且這裡不需要再轉回 hour:min:sec 的格式,直接使用結果即可
newtime=`expr $sum - $beg - $end`
echo $newtime
/usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i $i -t $newtime -c:v copy -c:a copy /data/tmp/$i -y
done
上面的 shell 腳本可以根據實際情況作出調整。
其他操作[4]
1.分離視訊音頻流
ffmpeg -i input_file -vcodec copy -an output_file_video //分離視訊流
ffmpeg -i input_file -acodec copy -vn output_file_audio //分離音頻流
2.視訊解複用
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
3.視訊轉碼
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始檔案
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始檔案
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝檔案
//-bf B幀數目控制,-g 關鍵幀間隔控制,-s 分辨率控制
4.視訊封裝
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
5.視訊剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖檔
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切視訊
//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間
6.視訊錄制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
7.YUV序列播放
ffplay -f rawvideo -video_size 1920x1080 input.yuv
8.YUV序列轉AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
9.視訊轉幀序列
ffmpeg -i split.avi %d.bmp
10.幀序列合并為視訊
ffmpeg -i %d.bmp -y list.mp4
其他操作[5]
視訊
1.擷取視訊流資訊
用ffprobe可以擷取到視訊的所有流的具體資訊
ffprobe -print_format json -show_streams -i input.mp4
1
2.多個視訊拼接
可以将幾個視訊拼接成一個視訊 -f 表示采用concat協定,-c 表示采用什麼編碼器 copy表示不重新編碼,如果是x264 表示将采用x264進行重新編碼。
ffmpeg -y -f concat -i videolist.txt -c copy output.mp4
1
3.視訊截圖
截一張圖
-ss 表示在視訊的多少S 截取一張圖
ffmpeg -y -ss 8 -i input.mp4 -f image2 -vframes 1 output.jpg
1
截多張圖
-r 表示每秒截多少張圖; -qscale 表示生成的截圖品質,該值越小圖檔品質越好;%5d.jpg 表示生成的截圖的指令規則,5位數的整數命名。
ffmpeg -y -ss 0 -i input.mp4 -f image2 -r 1 -t 8 -qscale 1 ./jpgs/%5d.jpg
1
4.給視訊加上水印圖檔
ffmpeg -y -i input.mp4 -i ./logo.png filter_complex "overlay=0:0:enable=between(t,0,2)" -c:v libx264 -c:a aac -strict -2 output.mp4
1
5.圖檔合成視訊
ffmpeg -y -f image2 -framerate 10 -i ./jpgs/%05d.jpg -c:v libx264 -r 25 -pix_fmt yuv420p output.mp4
1
6.視訊添加背景音樂
ffmpeg -y -i input.mp4 -i ainiyiwannian.wav -filter_complex "[0:a] pan=stereo|c0=1*c0|c1=1*c1 [a1], [1:a] pan=stereo|c0=1*c0|c1=1*c1 [a2],[a1][a2]amix=duration=first,pan=stereo|c0<c0+c1|c1<c2+c3,pan=mono|c0=c0+c1[a]" -map "[a]" -map 0:v -c:v libx264 -c:a aac -strict -2 -ac 2 output.mp4
1
7.将視訊去除音頻
ffmpeg -y -i source.mp4 -an -vcodec copy output.mp4
1
8.設定視訊的音量
-vol 設定視訊的音量,是以%為機關,500表示500%
ffmpeg -y -i source.mp4 -vol 500 -strict -2 -vcodec copy output.mp4
1
9.視訊轉碼
-vcodec 指定視訊編碼器,-acodec 指定音頻編碼器
ffmpeg -y -i input.mp4 -vcodec libx264 -acodec copy output.mp4
音頻處理
1.從視訊中提取音頻
ffmpeg -y -i source.mp4 -vn output.wav
2.将音頻用lpcm格式重新編碼,指定采樣率
ffmpeg -y -i source.wav -acodec pcm_s16le -ar 44100 output.wav
目錄:
1. FFmpeg簡介 FFmpeg編碼流程 FFmpeg混淆概念
2.FFmpeg操作參數
3.FFmpeg常用操作
參考
- ^FFmpeg操作參數: https://blog.csdn.net/leixiaohua1020/article/details/12751349
- ^FFmpeg操作參數: https://blog.csdn.net/z2066411585/article/details/81237583
- ^FFmpeg操作參數: https://www.cnblogs.com/yongfengnice/p/6778019.html
- ^操作指令 https://www.cnblogs.com/dwdxdy/p/3240167.html
- ^其他操作 https://blog.csdn.net/baohonglai/java/article/details/50535955