1. 大家在使用ffmpeg進行視頻編碼時,使用-b命令,想控制比特率,卻發現結果並沒有如我們設置所願,通過碼流分析器觀察視頻碼流,碼率的波動還是很大的,ffmpeg控制的並不好,這時候,我們可以通過以下命令解決:
-maxrate biterate -minrate biterate -bf 1 -b_strategy 0
其中 -maxrate、-minrate為設置最小最大比特率,-bf為設置B幀數目,其實就是設置編碼是B、P、I幀的結構,我這里設置的為IPBPBP結構,-b_strategy這個命令是為了自適應的添加B幀數目,ffmpeg編碼器會根據視頻的應用場景,自適應的添加B幀,通過設置-b_strategy 0,,將這個功能關閉,那么就會根據你的設置要求進行編碼。除此之外,還可以使用-pass,進行2次碼率控制,編出來的視頻效果更好;下面我介紹-pass的使用方法:
(1) -pass 1 -passlogfile ffmpeg2pass 第一步先編一次,生成 ffmpeg2pass 文件
(2) -pass 2 -passlogfile ffmpeg2pass 第二次會根據第一次生成的ffmpeg2pass 文件,再進行碼率控制。
剛開始我只使用-g命令,設置GOP長度,編碼后,發現I幀間隔長度並不是我想要的,后來我通過以下命令問題解決了:
-keyint_min 60 -g 60 -sc_threshold 0
其中-keyint_min為最小關鍵幀間隔,我這里設置為60幀;-sc_threshold這個命令會根據視頻的運動場景,自動為你添加額外的I幀,所以會導致你編出來的視頻關鍵幀間隔不是你設置的長度,這是只要將它設為0,問題就得到解決了!!
3.在用ffmpeg轉換視頻到flv過程中,需要設置關鍵幀的間隔,以便在播放過程中實現精確定位。在網上查找了不少,最后發現這個指令有效:
-g 1 -keyint_min 2
// 將關鍵幀幀間隔設置為2s
./ffmpeg -i ~/Documents/video/fc.mkv -acodec libfdk_aac -vcodec libx264 -keyint_min 50 -g 50 -sc_threshold 0 fc_transcode.mkv
如果使用OBS推流,可以在設置中設置關鍵幀間隔