Ffmpeg用法總結(下)
第五部分 裁剪/填充視訊
裁剪視訊crop filter
從輸入檔案中選取你想要的矩形區域到輸出檔案中,常見用來去視訊黑邊。
- 語法:
crop:ow[:oh[:x[:y:[:keep_aspect]]]]
- 1.舉例
1.1.裁剪輸入視訊的左三分之一,中間三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
1.2.裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的預設值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
1.3.裁剪中間一半區域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi
- 2.舉例
2.1比較裁剪後的視訊和源視訊比較
ffplay -i jidu.mp4 -vf split[a ][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40
2.2自動檢測裁剪區域
cropdetect filter 自動檢測黑邊區域
ffplay jidu.mp4 -vf cropdetect
2.3然後用檢測到的值來裁剪視訊
ffplay jidu.mp4 –vf crop=672:272:0:54
填充視訊(pad)
在視訊幀上增加一快額外額區域,經常用在播放的時候顯示不同的橫縱比
- 語法:
pad=width[:height:[:x[:y:[:color]]]]
- 舉例
1.建立一個30個畫素的粉色寬度來包圍一個SVGA尺寸的圖片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg
2.同理可以製作testsrc視訊用30個畫素粉色包圍視訊
ffplay -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink
3.?4:3到16:9
一些裝置只能播放16:9的橫縱比,4:3的橫縱比必須在水平方向的兩邊填充成16:9,高度被保持,寬度等於高度乘以16/9,x(輸入檔案水平位移)值由表示式(output_width - input_width)/2來計算。
4:3到16:9的通用命令是:
ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output
這裡寫程式碼片
舉例
ffplay -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink
4.16:9到4:3
為了用4:3的橫縱比來顯示16:9的橫縱比,填充輸入檔案的垂直兩邊,寬度保持不變,高度是寬度的3/4,y值(輸入檔案的垂直偏移量)是由一個表示式(output_height-input_height)/2計算出來的。
16:9到4:3的通用命令:
ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output
舉例
ffplay -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink
第六部分 翻轉和旋轉
翻轉
- 水平翻轉語法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
- 垂直翻轉語法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
旋轉
語法:transpose={0,1,2,3}
0:逆時針旋轉90°然後垂直翻轉
1:順時針旋轉90°
2:逆時針旋轉90°
3:順時針旋轉90°然後水平翻轉
第七部分 模糊,銳化
模糊
- 語法:
boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
**注意:**luma_r和alpha_r半徑取值範圍是0~min(w,h)/2, chroma_r半徑的取值範圍是0~min(cw/ch)/2
銳化
- 語法:-vf
unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的引數是可選的,預設值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩陣,取值範圍3-13,預設值為5
l_msize_y:垂直亮度矩陣,取值範圍3-13,預設值為5
l_amount:亮度強度,取值範圍-2.0-5.0,負數為模糊效果,預設值1.0
c_msize_x:水平色彩矩陣,取值範圍3-13,預設值5
c_msize_y:垂直色彩矩陣,取值範圍3-13,預設值5
c_amount:色彩強度,取值範圍-2.0-5.0,負數為模糊效果,預設值0.0
- 舉例
使用預設值,亮度矩陣為5x5和亮度值為1.0
ffmpeg -i input -vf unsharp output.mp4
高斯模糊效果(比較強的模糊):
ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2
第八部分 覆蓋(畫中畫)
覆蓋
- 語法:
overlay[=x[:y]
所有的引數都是可選,預設值都是0 - 1舉例
Logo在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
- 2舉例
Logo右上角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4
刪除logo
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的座標
w:h logo的寬和高
t: 矩形邊緣的厚度預設值4
show:若設定為1有一個綠色的矩形,預設值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
第九部分 新增文字
新增文字
- 語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的引數值
x:離左上角的橫座標
y: 離左上角的縱座標
fontcolor:字型顏色
fontsize:字型大小
text:文字內容
textfile:文字檔案
t:時間戳,單位秒
n:幀數開始位置為0
draw/enable:控制檔案顯示,若值為0不顯示,1顯示,可以使用函式
簡單用法
1、在左上角新增Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央新增Good day
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Goodday’:x=(w-tw)/2:y=(h-th)/2”
3、設定字型顏色和大小
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Happy Holidays’:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30”
動態文字1
用 t (時間秒)變數實現動態文字
1、頂部水平滾動
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
2、底部水平滾動
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直從下往上滾動
ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
想實現右上角顯示當前時間?
動態文字2
1.在右上角顯示當前時間 localtime
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“
2.每隔3秒顯示一次當前時間
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"
第十部分 圖片處理
圖片支援
FFmpeg支援絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
1.擷取一張圖片使用 –ss(seek from start)引數.
ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
2.從視訊中生成GIF圖片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
3.轉換視訊為圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
4.圖片轉換為視訊
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
裁剪、填充
和視訊一樣,圖片也可以被裁剪和填充
1.裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
2.填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻轉,旋轉,覆蓋
和視訊一樣圖片同樣能翻轉,旋轉和覆蓋
1.翻轉
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
2.旋轉
ffmpeg -i image.png -vf transpose=1 image_rotated.png
3.覆蓋
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
第十一部分 其他高階技巧
螢幕錄影
1.顯示裝置名稱
ffmpeg -list_devices 1 -f dshow -i dummy
2.呼叫攝像頭
ffplay -f dshow -i video="Integrated Camera"
3.儲存為檔案
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
4.新增字幕subtitles
語法 –vf subtitles=file
ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
視訊顫抖、色彩平衡
1.視訊顫抖
ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
2.色彩平衡
ffplay -i jidu.mp4 -vf curves=vintage
3.色彩變幻
ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“
4.彩色轉換黑白
ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"
設定音訊視訊播放速度
[email protected]倍視訊播放視訊
ffplay -i jidu.mp4 -vf setpts=PTS/3
[email protected]?速度播放視訊
ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
[email protected]倍速度播放音訊
ffplay -i speech.mp3 -af atempo=2
問題:視訊和音訊同時3/4慢速播放
截圖
1.每隔一秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
2.每隔20秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
**注意:**ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一張圖。
3.多張截圖合併到一個檔案裡(2x3) ?每隔一千幀(秒數=1000/fps25)即40s截一張圖
ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png
馬賽克視訊
1.馬賽克視訊
用多個輸入檔案建立一個馬賽克視訊:
ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv
Logo動態移動
1、2秒後logo從左到右移動:
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0
2、2秒後logo從左到右移動後停止在左上角
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
3、每隔10秒交替出現logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
資料
FAQ
相關推薦
Ffmpeg用法總結(下)
第五部分 裁剪/填充視訊 裁剪視訊crop filter 從輸入檔案中選取你想要的矩形區域到輸出檔案中,常見用來去視訊黑邊。 語法: crop:ow[:oh[:x[:y:[:keep_aspect]]]] 1.舉例 1.1.裁剪輸入視訊的
Oracle中Merge into用法總結 (轉載)
字符 存在 sin 刪除 ron mic 但是 多個 前段時間 Oracle中Merge into用法總結 (出處:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因: 前段時間,因為涉及到一張表的大數據操作,要同時
2017上海QCon之旅總結(下)
最終 方式 這場 監控 第一個 -c 感覺 服務端 備份 本來這個公眾號的交流消息中間件相關的技術的。十月去上海參加了QCon,第一次參加這樣的技術會議,感受挺多的,所以整理一下自己的一些想法接公眾號和大家交流一下。 三天的內容還挺多的,之前已經有上篇和中篇,這一片是最後
標準C++中的string類的用法總結(轉)
spa 大小 它的 world 包括 文本 語法 ner append() 轉自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC編程的朋友對CString這個類的印象應該
Git:git-checkout的用法總結(2)
參考 正文 nsa dex block -o onf script 還需要 原帖收藏於IT老兵驛站,傳遞一個IT老兵在雕零前的光和氧。 前言 結合前一篇文章,再認真總結一下git-checkout的用法,因為可能一次總結到不了位,那麽就不怕啰嗦,不怕重復,多總結幾次,這樣可
TCP協議學習總結(下)
out 窗口 我們 中間 strong 以及 簡單 就是 bsp 在前兩邊TCP學習總結中,也大概地學習了TCP的整個流程,但許多細節中的細節並沒有詳細學習,例如超時重傳問題,每次瓶頸回歸慢啟動效率問題以及最大窗口限制問題等。本學習篇章最要針對這些細節中的細節進行學習。TC
$.extend()用法總結(轉載)
1.用法描述 $.extend(setting,option)用於合併物件setting和物件option並將合併後的值返回給setting 常規用法(1) var settings = { validate: false, limit: 5, name: "foo" }; var opti
第一行程式碼-運用手機多媒體總結(下)
從相簿中選擇照片 第一步,開啟相簿 //判斷是否有許可權,沒有就申請開啟相簿的許可權,有則開啟相簿 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_
用Vue開發仿旅遊站webapp專案總結 (下)
用Vue開發仿旅遊站webapp專案總結 (上) 該說的話,該表明的上篇已經表明了。謝謝上篇評論區一些同學~ 很鼓勵我,不過下下篇估計沒了,這篇總結完,下下篇可能就是之後學習路的總結記錄啦。 有些話還是要說的 接觸vue不久的朋友應該會有收穫。此專案也才是萌新做的第二個Vue專案,使
珍藏 | 基於深度學習的目標檢測全面梳理總結(下)
關於作者:@李家丞 同濟大學數學系本科在讀,現為格靈深瞳演算法部實習生。 作者個人主頁:李家丞 | 個人主頁 | 關於我 導言:目標檢測的任務表述 如何從影象中解析出可供計算機理解的資訊,是機器視覺的中心問題。深度學習模型由於其強大的表示能力,加之資料量的積累和
php大括號{}用法總結(轉)
在PHP中,大括號“{}”可以起到如下作用: 1、將多個獨立語句合併為一個複合語句,例如 if ... else ...中經常如此使用 2、在變數間接引用中進行定界,避免歧義。例如 ${$my_var[8]}與${$my_var}[8]的區分 3、用於
C語言中操作符總結(下)
邏輯操作符 常見的邏輯操作符: 邏輯與( && )、 邏輯或( || ) 邏輯操作運算中不看二進位制位,只看真假。 使用規則: 邏輯與( && ):操作符作用的兩個運算元全為 真 時結果為 “ 1 ” ,其他情況結果都為 “
Robot Framework用法總結(二):簡單的用例編寫
3.簡單用例編寫 3.1建立專案New Project 注:選擇directory原因是,在directory的專案下可以建立測試套件,如果是tpye為file,則只能建立測試用例,這不利於用例的管理。 3.2建立測試套件New Suit 右鍵點選Test
Vim用法總結(轉)
曾經使用了兩年多的Vim,手冊也翻過一遍。雖然現在不怎麼用vim了,曾經的筆記還是貼出來,與喜歡vim的朋友分享。 vim是我最喜歡的編輯器,也是Linux下第二強大的編輯器。 雖然emacs是公認的世界第一,我認為使用emacs並沒有使用vi進行編輯來得高效。 如果是
【集合詳解】Java集合總結(下)-常用集合類對比
今天我們主要看一張圖。 圖是無意中在網上發現的,個人覺得非常好。(時間久了就忘了出處,請原創原諒~~) 我們還是從左到右分析。 ①所有的類都用到Iterator則說明所有的集合類都有遍歷集合的方法。 ②LinkedList除了繼承AbstractSe
遊戲程式設計十年總結(下)
在繁忙的工作中,我完成了第一本Cocos2d-x書籍,這是第三次的推翻重寫。每次寫了一段時間之後,回過頭看之前寫的文章,頓時覺得慘不忍睹,必須推翻重寫,或者是Cocos2d-x的介面又改了,或者是自己能力的提升推翻了之前的一些想法。總之不想將就,就得重構!就這樣斷斷續續地寫了三年多,直到最近這本書終於出
Hive常用函式總結(下)
這篇繼續我們介紹我們的函式,上篇連結: https://blog.csdn.net/Forever_ck/article/details/85268145 閒話少敘,開整: current_date 獲取當前日期 rtrim 去除字串右邊空格 split 將字串按
opencv中addWeighted()函式用法總結(05)
還是老習慣,分三步走。第一步,功能說明。第二步,結果圖顯示,第三步,API詳解。第四步,程式碼展示(註釋很詳細,保證所有有C++基礎的人都可以看懂。) 第一步,功能說明:addWeighted()函式是將兩張相同大小,相同型別的圖片融合的函式。他可以實現圖片的特效,不多說了
Latex中的表格用法總結(三)
我們可以使用makecell命令對錶格單元格中的資料進行一些變換的控制。我們可以使用 \ 命令進行換行,也可以使用p{(寬度)}選項控制列表的寬度 使用\makecell 命令我們需要在導言區新增\usepackage{makecell}才能正常編譯通過。\m
C語言sscanf函式用法總結(一) 正則表示式
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; void sscanf_te