1. 程式人生 > >Ffmpeg用法總結(下)

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