前言:前兩個月寫了OpenGL入門系列文章,感興趣可以點擊我的主頁進行查看。
從今天開始,預計花費3個月時間(晚上+周末),學習Android音視頻開發。
Android音視頻開發的系列文章不多,而且一開始介紹各種概念,看了想睡覺,實踐是檢驗真理的唯一標準,so,第一篇文章先實踐一下,玩玩FFmpeg,圖比較多~
進入正題
作為音視頻系列的第一篇文章,先不說音視頻的一堆概念,后面涉及到代碼再慢慢介紹,先來玩一玩目前音視頻領域的一哥 ---》FFmpeg
1、下載靜態庫
這里我選mac
https://ffmpeg.org/download.html#build-mac
下載完解壓,進bin目錄,就可以玩玩shell命令了
test.mp4是我放進去的,一個抖音毒雞湯視頻,接下來實戰一波~
2、玩玩常用命令
1.改變幀率 -r
幀率:每秒繪制的次數,玩過王者榮耀的人應該都知道,幀率越高越流暢
./ffmpeg -i test.mp4 -r 30 output_-r30.mp4
2.改變碼率 -b
碼率:(比特率)是一個決定音頻或視頻質量的參數,在FFmpeg中,碼率是指每秒比特數。-b:v表示視頻碼率,-b:a表示音頻碼率。例如,設置每秒400k,可以用以下命令
./ffmpeg -i test.mp4 -b:v 400k output-b400k.mp4
一個15m的視頻通過設置碼率400k,大小變成了3m,清晰度還可以。
3.設置輸出文件大小, -fs
./ffmpeg -i test.mp4 -fs 5MB output-fs-5MB.mp4
文件大小單位是byte,
輸出文件大小是視頻流和音頻流文件大小的總和。
4.調整視頻分辨率(寬高) -s
./ffmpeg -i test.mp4 -s 320x240 output_320x240.mp4
可以看到,變形了
5.去掉音頻 -an
./ffmpeg -an -i test.mp4 output-an.mp4
輸出的mp4只有視頻沒有聲音
6.裁剪/填充視頻
-vf filter_graph ,設置視頻過濾器
過濾器有很多種
6.1裁剪: crop
裁剪左邊1/3
./ffmpeg -i test.mp4 -vf crop=iw/3:ih:0:0 output_crop1.mp4
中間1/3
./ffmpeg -i test.mp4 -vf crop=iw/3:ih:iw/3:0 output_crop2.mp4
右邊1/3
./ffmpeg -i test.mp4 -vf crop=iw/3:ih:iw/3*2:0 output_crop3.mp4
裁剪矩形中間w寬和h高區域(w:400,h:400)
./ffmpeg -i test.mp4 -vf crop=400:400 output_crop_400.mp4
默認從輸入視頻的中間區域開始
裁剪中間一半
./ffmpeg -i test.mp4 -vf crop=iw/2:ih/2 output_crop_w0.5h0.5.mp4
6.2 填充: pad
在視頻幀上增加一快額外區域
語法:
pad=width[:height:[:x[:y:[:color]]]]
給視頻加一個30像素厚度的粉色邊框
./ffmpeg -i test.mp4 -vf pad=iw+60:ih+60:30:30:pink output_pad.mp4
4:3轉16:9
./ffmpeg -i test.mp4 -vf pad=ih*16/9:ih:(ow-iw)/2:0 output_16-9.mp4
高度保持不變,寬度等于高度ih*16/9,x用表達式(ow-iw)/2計算
16:9轉4:3
寬度不變,高=寬x3/4
./ffmpeg -i output_16-9.mp4 -vf pad=iw:iw*3/4:0:oh/2-ih/2 output_4-3.mp4
7. 翻轉和旋轉
7.1 翻轉
水平翻轉: -vf hflip
./ffmpeg -i test.mp4 -vf hflip output_hflip.mp4
垂直翻轉:-vf vflip
./ffmpeg -i test.mp4 -vf vflip output_vflip.mp4
7.2 旋轉
語法:transpose={0,1,2,3}
0:逆時針旋轉90°然后垂直翻轉
1:順時針旋轉90°
2:逆時針旋轉90°
3:順時針旋轉90°然后水平翻轉
逆時針旋轉90°然后垂直翻轉
./ffmpeg -i test.mp4 -vf transpose=0 output_transpose0.mp4
8.模糊和銳化視頻
使用smartblur 過濾器,不影響圖像輪廓
./ffmpeg -i test.mp4 -vf smartblur=5:0.8:0 output_smartblur.mp4
設置luma的半徑5,亮度0.8,亮度閾值是0
銳化或模糊視頻幀,可以使用unsharp濾波器,使用默認值
./ffmpeg -i test.mp4 -vf unsharp output_unsharp.mp4
hwdn3d 用于去噪
./ffmpeg -i test.mp4 -vf hqdn3d output_hqdn3d.mp4
9.畫中畫
兩個輸入,一個是原視頻,一個是logo(畫中畫)
9.1 logo在左上角
./ffmpeg -i test.mp4 -i logo.png -filter_complex overlay output_overlay.mp4
9.2 logo在右上角
./ffmpeg -i test.mp4 -i logo.png -filter_complex overlay=W-w output_overlay_right_top.mp4
W,H --背景圖寬和高
w,h -- 前景圖(logo)寬和高
9.3 logo 在右下角
./ffmpeg -i test.mp4 -i logo.png -filter_complex overlay=W-w:H-h output_overlay_right_bottom.mp4
9.4 同理,logo在左下角
./ffmpeg -i test.mp4 -i logo.png -filter_complex overlay=0:H-h output_overlay_left_bottom.mp4
9.5 一定時間間隔后添加logo,-itsoffset
./ffmpeg -i test.mp4 -itsoffset 5 -i logo.png -filter_complex overlay output_time5_logo.mp4
9.6 視頻中加入計時器
創建2位數計時器,大小是61*52像素
./ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 30 timer.ogg
視頻加入計時器
./ffmpeg -i test.mp4 -i timer.ogg -filter_complex overlay=W-w:0 output_timer.mp4
9.7 視頻上添加文字
語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
x:離左上角的橫坐標
y: 離左上角的縱坐標
fontcolor:字體顏色
fontsize:字體大小
text:文本內容
textfile:文本文件
t:時間戳,單位秒
n:幀數開始位置為0
draw/enable:控制文件顯示,若值為0不顯示,1顯示,可以使用函數
在左上角添加Welcome文字
./ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcome
arial.ttf 是一個字體文件,大家隨便下載一個ttf文件即可。
頂部水平滾動
./ffplay -i test.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
底部水平滾動,文字從txt文件讀,注意中文會亂碼
./ffplay -i test.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
垂直向上滾動:
./ffplay -i test.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=(w-tw)/2:y=h-t*100:fontcolor=darkorange:fontsize=30"
注意:
./ffplay 是播放命令,當然可以用./ffmpeg,然后后面加上輸出文件名就可以
10.垂直拼接視頻
./ffmpeg -i test.mp4 -i output_vflip.mp4 -filter_complex [0][1]vstack -y output_vstack.mp4
vstack 是垂直拼接,輸出拼接結果
同理,水平拼接 hstack
好了,基本常用的命令就先介紹到這里了。
下一篇文章將介紹FFmpeg編譯,敬請期待~