前言
FFmpeg是非常強大的音視頻處理工具,我們可以使用它來處理視頻合成、剪輯、加特效等等操作。
官方文檔至上 ,大家可以先閱讀FFmpeg的官方文檔
FFmpeg的官方文檔命令真的是太多太多,而且都是英文,感覺精通完這些命令,都夠學一門新語言了!
SO 為了讓一些小伙伴們快速的用上FFmpeg,我整理了一些FFmpeg的常用的知識和大部分日常用到的命令供大家查閱!
還不收藏嗎?廢話不多說上干貨!
關于音視頻需要了解的東西音/視頻流在音視頻領域,我們把一路音/視頻稱為一路流。如我們小時候經常使用VCD看港片,在里邊可以選擇粵語或國語聲音,其實就是CD視頻文件中存放了兩路音頻流,用戶可以選擇其中一路進行播放。
容器我們熟悉的mp4,rmvb,mkv,avi是多媒體容器文件格式(或稱多媒體封裝格式),所謂容器是指將不同的數據流(視頻流,音頻流,字幕流等)封裝在一個文件(載體)中。 播放時各種流分別進行解碼等處理后,然后輸出到顯示器和音響等設備進行播放。多媒體容器格式不同于編碼格式,一個容器中可以封裝多種編碼格式的媒體流。 流封裝了實際的媒體數據,如視頻流,音頻流和字幕流等。一般情況下,流中的數據只能使用一種編碼格式。
【更多音視頻學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】
C++程序員必看,抓住音視頻開發的大浪潮!沖擊年薪60萬
channel是音頻中的概念,稱之為聲道。在一路音頻流中,可以有單聲道,雙聲道或立體聲。
幀率幀率(frames per cond, fps)是每秒畫面刷新的次數,幀率越高視頻越流暢。一般來說30fps就是可以接受的,60fps則可以明顯提升交互感和逼真感,但是一般超過75fps一般就不容易察覺到有明顯的流暢度提升了。
分辨率分辨率表示畫面的精細程度,通常用像素密度來表示,常用的單位為ppi(像素每英寸)。通常像素密度越高畫面越精細,模糊程度越低。對于視頻文件而言,像素密度是無法控制的(由播放器和顯示設備決定)。我們通常用視頻的像素數來表示它的分辨率如1080x640, 640x320等。
比特率比特率(bit rate)又稱碼率,表示多媒體流每秒輸出的字節數,單位為KB/s,Kbps等。同樣的壓縮算法下,比特率越高音視頻的質量越好。
可變碼率(Variable Bitrate, VBR)指的是編碼器的輸出碼率可以根據輸入源信號的復雜度進行自適應調整,以在輸出質量保持不變的條件下盡可能減少數據量。VBR適用于存儲,不太適用流式傳輸。
固定碼率(Constant Bitrate, CBR)指的是編碼器輸出碼率固定,CBR不適合存儲,對于復雜內容可能沒有足夠碼率進行編碼,從而導致質量下降,同時會在簡單內容部分浪費一些碼率。
采樣率每秒鐘對音頻信號的采樣次數,采樣頻率越高聲音還原度越高,聲音更加自然,單位是赫茲 Hz。音頻文件一般使用的采樣率是 44.1kHz,也就是一秒鐘采樣44100次,實驗發現低于這個值就會有較明顯的損失,而高于這個值人的耳朵已經很難分辨,而且增大了數字音頻所占用的空間。
視頻編碼視頻流可以看做圖片的序列,我們把這個序列中的一張圖片稱為一幀。若存儲視頻中所有幀則會數據量過大,不便于存儲和傳輸。所幸統計表明大多數視頻相鄰幀之間的區別并不大,所以對于一段變化不大的視頻,我們可以先完整編碼幀A,其后的B幀只需要編碼與A幀不同的部分,B幀后的C幀則只編碼與B幀的差異。如此遞推,將一段視頻編碼為一個序列。當某個圖像與之前的圖像變化很大無法參考前面的幀來生成,我們就結束上一個序列將該幀完整編碼開始一個新的序列。
H264是目前流行的一種視頻編碼算法,它定義了三種幀:完整編碼的I幀,參考I幀生成只包含差異的P幀,以及以及參考前后幀編碼的B幀。H264采用的核心算法是幀內壓縮和幀間壓縮,幀內壓縮是生成I幀的算法,幀間壓縮是生成B幀和P幀的算法。通常,我們也把完整編碼的I幀稱為關鍵幀。因為解碼非關鍵幀需要解碼其參考的幀,因此在截圖等不需要全部解碼的操作中,經常截取關鍵幀以提升性能。FFmpeg的基本字符命令-i 輸入文件的地址-y 表示直接覆蓋已經存在的輸出文件-n 表示若某個輸出文件已經存在則退出(若沒有設置-y或-n選項,且某個輸出文件已經存在ffmpeg會詢問是否要覆蓋輸出文件)-codec(-c) 指定輸入輸出的解碼編碼器 copy 則將輸入流直接復制到輸出流不進行編解碼操作-c:v 或-vcodec 可以為所有視頻流指定編碼器,-c:v:1為第2個視頻流指定編解碼器。xvid(使用XVID編碼壓縮視頻,不能改的)-c:a 或-acodec 可以為所有音頻流指定編碼器,-c:a:12為第13個視頻流指定編解碼器。-pixel_format/-pix_fmt 指定轉換格式 例:yuv420p-vol 音量-ss 選項用于設置流的開始時間,可以設置輸入輸出或者濾鏡。在開始時間之前的幀將被跳過不被處理(輸入不被解碼,輸出不被編碼,濾鏡不被處理)。例:ffmpeg -ss 2 -t 10 -i test.mp4 test.mov時長的格式:如-t 10, -t 23.167 時分秒: 如-t 10:23, -t 21:31:00.233-t 選項用于用于設置輸入輸出,-t在-i前可以限制輸入時長,-t在輸出文件前可以限制輸出時長-to 選項類似于-t選項,不同的是-to指定結束時刻,-t指定持續時間-f 強制設置輸入輸出的文件格式,默認情況下ffmpeg會根據文件后綴名判斷文件格式-filter / -filter_complex 使用過濾器對流進行處理 復雜過濾器-vf 代替-filter:v處理視頻流-af 代替-filter:a處理音頻流-vframes 設置要輸出的視頻幀的數量: 例:ffmpeg -i test.mp4 -vframes 10 test.mov-aframes 設置要輸出的音頻幀的數量。這是-frames:a的一個過時的別名。-vn 不將視頻流寫到輸出文件中無視頻的意思 例:ffmpeg -i test.mp4 -vn -a:c copy out.mp3-an 不將音頻流寫到輸出文件中無音頻的意思 例:ffmpeg -i test.mp4 -v:c copy -an out.mp4-r 設置某個流的幀率按ffmpeg官方文檔說-r與-framerate作用相同,但實際測試時發現不同。-framerate 用于限制輸入,而-r用于限制輸出 例:ffmpeg -i test.mp4 -r:v 30 test.mov-s 設置幀的大小 例:ffmpeg -i test.mp4 -s 1080x680 out.mp4-aspect [:stream_specifier] 寬高比(輸出,每個流) 設置方面指定的視頻顯示寬高比。aspect可以是浮點數字符串,也可以是num:den形式的字符串,其中num和den是寬高比的分子和分母。例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的參數值。如果與-vcodec副本一起使用,則會影響存儲在容器級別的寬高比,但不會影響存儲在編碼幀中的寬高比(如果存在)。-threads 設置處理線程數 例:ffmpeg -threads 8 -i test.mp4 out.mp4-shortest 當最短的輸入流結束后即停止編碼和輸出 例:ffmpeg -i bgm.mp3 -i test.mp4 -shortest output.mp4-sample_fmts 設置音頻采樣格式。使用-sample_fmts獲取支持的樣本格式列表。-b:a 指定音頻碼率。 b 是 bitrate的縮寫, a是 audio的縮寫-b:v 指定視頻碼率。 b 是 bitrate的縮寫, v是 video的縮寫-loop 循環輸入流。只工作于圖像流concat 拼接視頻 例:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -c copy output.mp4Filter(濾鏡)復雜過濾器(filter_complex)過濾器會對已解碼的幀進行處理,處理后的幀會被重新編碼輸出
scale指定操作源的大小,iw指定按整型取視頻的寬度,ih指定按整型取視頻的高度。-1為按原圖比例變化 例:iw/2:-1視頻縮小一倍
overlay指定操作源擺放的位置 overlay=30:10 main_w和main_h為底層視頻的寬和高,overlay_w和overlay_h為疊加視頻的寬和高
delogo刪除水印 例:delogo=x=800:y=20:w=70:h=80
【更多音視頻學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】
C++程序員必看,抓住音視頻開發的大浪潮!沖擊年薪60萬
crop裁剪 格式:crop=out_w:out_h: x :y out_w: 輸出的寬度。可以使用 in_w 表式輸入視頻的寬度。 out_h: 輸出的高度。可以使用 in_h 表式輸入視頻的高度。 x : X坐標 y : Y坐標 x和y 設置為 0,說明從左上角開始裁剪。如果不寫是從中心點裁剪
tptstpts=0.5*PTS表示每幀視頻的pts時間戳都乘0.5,也就是視頻加快一倍
-map可用于處理復雜輸出,如可以將指定的多路流輸出到一個輸出文件,也可以指定輸出到多個文件。"[v]" 復雜濾鏡輸出的別名作為輸出文件的一路流。上面 map的用法是將復雜濾鏡輸出的視頻和音頻輸出到指定文件中。
水平翻轉hflip鏡像crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right]
各種特效curvescurves='vintage'(復古) 'strong_contrast'(強對比度)'lighter'(變亮) 'negate'(底片) 'none' 'color_negative'(彩色底片);
邊緣檢測edgedetect光暈vignette=PI/4變暗colorlevels=rimin=0.058:gimin=0.058:bimin=0.058
增加對比度fftfilt=dc_Y=0:weight_Y='exp(-4 * ((Y+X)/(W+H)))
降噪hqdn3d=luma_spatial=15.0
銳化fftfilt=dc_Y=0:weight_Y='1+squish(1-(Y+X)/100)'
低通濾波fftfilt=dc_Y=0:weight_Y='squish((Y+X)/100-1)'
高通濾波fftfilt=dc_Y=128:weight_Y='squish(1-(Y+X)/100)'
fade 視頻淡入淡出效果例:fade=in:0:25, fade=out:975:25 從0楨開始淡入25幀,從975開始淡出25幀 fade=in:5:20:color=yellow 開始淡入前為黃色 fade=in:0:25:alpha=1 淡入完成后過去15幀的透明度 fade=t=in:st=5.5:d=0.5 5.5秒開始,淡入0.5秒 d為時長
fps濾鏡通過刪除幀或者復制幀的方法強制設置幀率 例:ffmpeg -y -i test.mp4 -vf "fps=60" out.mp4
常用命令視頻格式轉換ffmpeg -i out.mp4 -y out.avi
視頻轉Gif視頻轉Gif
ffmpeg -i out.mp4 -y out.gif
從0開始截10s轉Gif
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 -y out.gif
視頻轉多張圖片每秒生成一個張圖片ffmpeg -i input_test.mp4 -vf fps=1 out%03d.png
每分鐘生成一張圖片ffmpeg -i input_test.mp4 -vf fps=1/60 out%03d.png
截取視頻中的某段視頻ffmpeg -ss 2 -i test.mp4 -t 10 -y -f out_test.mp4
截取從2s開始10秒的視頻
視頻分片(把視頻切為一段一段)ffmpeg -i test.mp4 -c copy -map 0 -f gment -gment_time 10 video/part-%d.mp4
截取視頻中某個時間段的單張圖片或多張圖片ffmpeg -ss 2 -i test.mp4 -r 1 -t 2 -y -f image2 image-%3.jpeg
單張圖片或多張圖片轉視頻ffmpeg -loop 1 -i img%3d.png -t 10-y output.mp4
Gif轉視頻ffmpeg -i input.gif -y output.mp4
多個視頻合并ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4
修改視頻分辨率ffmpeg -i input_test.mp4 -s 320*240 out_test.mp4
給視頻添加音頻ffmpeg -i input.mp4 -i input1.mp3 -y output.mp4
提取視頻中的音頻ffmpeg -i test.mp4 -vn -a:c copy out.mp3
視頻靜音ffmpeg -i input.mp4 -an -vcodec copy output.mp4
音頻合并ffmpeg -i "concat:test1.mp3|test2.mp3" -acodec copy output.mp3
高級命令音頻混音ffmpeg -i input_01.wav -i input_02.wav -filter_complex amix=inputs=2:duration=shortest:dropout_transition=3 output.wav
以兩個音頻文件時長較短的音頻文件時長作為最終輸出的時長
inputs: The number of inputs. If unspecified, it defaults to 2.//輸入的數量,如果沒有指明,默認為2.duration: 決定了流的結束longest: 最長輸入的持續時間shortest:最短輸入的持續時間first: 第一個輸入的持續時間dropout_transition: 輸入流結束時(音頻)容量重整化的轉換時間(以秒為單位)。 默認值為2秒。添加文字水印ffmpeg -y -i test.mp4 -vf "drawtext=fontfile=CourierNew.ttf:text='hello world':x=100:y=50:fontsize=24" out.mp4
Android端添加文字水印由于Android端字體庫的原因,我可以通過把文字轉成圖片,再加到視頻上的方式來添加,以下是文字轉圖片的源碼:
/**
* 文本轉成Bitmap
* @param text 文本內容
* @param context 上下文
* @return 圖片的bitmap
*/
private static Bitmap textToBitmap(String text , Context context) {
float scale = context.getResources().getDisplayMetrics().scaledDensity;
TextView tv = new TextView(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
tv.tLayoutParams(layoutParams);
tv.tText(text);
tv.tTextSize(scale * TEXT_SIZE);
tv.tGravity(Gravity.CENTER_HORIZONTAL);
tv.tDrawingCacheEnabled(true);
tv.tTextColor(TEXT_COLOR);
tv.tBackgroundColor(Color.WHITE);
tv.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
tv.buildDrawingCache();
Bitmap bitmap = tv.getDrawingCache();
int rate = bitmap.getHeight() / 20;
return Bitmap.createScaledBitmap(bitmap, bitmap.getWidth()/rate, 20, fal);
}
/**
* 文字生成圖片
* @param filePath filePath
* @param text text
* @param context context
* @return 生成圖片是否成功
*/
public static boolean textToPicture(String filePath, String text , Context context){
Bitmap bitmap = textToBitmap(text , context);
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
return fal;
}finally {
try {
if(outputStream != null){
outputStream.clo();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
【更多音視頻學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】
C++程序員必看,抓住音視頻開發的大浪潮!沖擊年薪60萬
添加圖片水印添加單個圖片水印
ffmpeg -i input.mp4 -i water.png -filter_complex "[0:v][1:v]overlay=main_w-overlay_w-10:10" -y output.mp4
添加多個圖片水印
ffmpeg -i input.mp4 -i photo1.png -i photo2.png -filter_complex "[0:v]fade=in:st=0:d=2,curves=vintage[img];[1:v]scale=300:-1[img1];[img][img1]overlay=10:10[out1];[out1][2:v]overlay=main_w:main_h" -y output.mp4
添加了兩張圖片圖片,第一張設置為寬度300,高度-1為根據原圖片比例縮放,在視頻左上角,第二張圖片在視頻右下角,fade是淡入淡出效果器,視頻效果為從0s開始淡入,淡入2s,視頻為復古效果curves=vintage
跑馬燈效果ffmpeg -i video2.mp4 -i logo.png -filter_complex "[1:v]scale=50*50[logo];[0:v]scale=200*200[bg];[bg][logo]overlay=x='if(gte(t,0),-overlay_w+(mod(n,main_w+overlay_w))+5,NAN)':y=0" -y output.mp4
含義: 時間t大于0,那么就開始從子內容的寬度的x-overlay_w位置開始,然后每一幀n計數,幀數n除以(背景main_w+子內容背景overlay_w)求除數+1設置為x坐標,即可循環 overlay=30:10 main_w和main_h為底層視頻的寬和高,overlay_w和overlay_h為疊加視頻的寬和高
視頻去水印ffmpeg -i test.flv -vf delogo=x=20:y=20:w=70:h=80 output.flv
x,y :指定水印的位置,即圖片左上角的坐標 w,h:給出水印的寬高
添加動畫ffmpeg -y -i test.mp4 -t 10 -loop 1 -framerate 6 -i test_%3d.png -filter_comple 'overlay=10:main_h-overlay_h-10' out.mp4
將多張圖片(test_001.png, ani002.png...)組成動畫, 然后將這個動畫疊加在視頻的左下角。-t 10 -loop 1會循環播放動畫,持續10s
淡入淡出效果器ffmepg -i input.wav -filter_complex afade=t=in:ss=0:d-4 output.wav
(淡入)把 input 文件的前5s 做一個淡入效果,輸出到 output.wav 中
ffmpeg -i input.wav -filter_complex afade=t=out:st=200:d=5 output.wav
(淡出)將input.wav文件從200s開始,做5s的淡出效果,并放到output.wav文件中
視頻提亮效果器ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=brightness=0.25 -f mp4 output.mp4
提亮參數是brightness,取值范圍是從-1.0到1.0,默認值是0
為視頻增加對比度效果ffmpeg -i input.flv -c:v libx264 -b:v 800k -c:a libfdk_aac -vf eq=contrast=1.5 -f mp4 output.mp4
對比度參數是contrast,取值范圍是從-2.0到2.0,默認值是1.0
截取視頻區域ffmpeg -i input.mp4 -an -vf "crop=480:480:120:0" -vcodec libx264 -b:v 800k output.mp4
旋轉視頻ffmpeg -i input.mp4 -vf "transpo=1" -b:v 600k output.mp4
改變視頻音量ffmpeg -i input.mp4 -af 'volume=0.5' output.mp4
壓縮視頻-pret superfast 可以加快合成視頻時間
視頻壓縮主要是改變視頻的碼率、比特率和分辨率去壓縮,但是需要控制好縮小的碼率和分辨率,以保證視頻的質量符合你的需求 ffmpeg -i input.mp4 -b:v 600k -y output.mp4
推薦比特率阿里云給的建議
如果你對音視頻開發感興趣,覺得文章對您有幫助,別忘了點贊、收藏哦!或者對本文的一些闡述有自己的看法,有任何問題,歡迎在下方評論區討論!
本文發布于:2023-02-28 20:03:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167765206675002.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:xvid編碼器(xvid編碼器視頻太大).doc
本文 PDF 下載地址:xvid編碼器(xvid編碼器視頻太大).pdf
| 留言與評論(共有 0 條評論) |