日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

刘歧:FFmpeg Filter深度应用

發(fā)布時(shí)間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 刘歧:FFmpeg Filter深度应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


本文來自O(shè)nVideo視頻創(chuàng)作云平臺聯(lián)合創(chuàng)始人劉歧在LiveVideoStackCon的講師熱身分享,劉歧分享了FFmpeg的基本原理、使用方法及開發(fā)方法。在10月19-20日的LiveVideoStackCon 2018上,劉歧還將分享如何通過FFmpeg實(shí)現(xiàn)視頻版權(quán)保護(hù)的方法。


文 / 劉歧

整理 / LiveVideoStack

直播回放:

https://www.baijiayun.com/web/playback/index?classid=18081550127330&session_id=201808160&token=UpmOXagOUwZt681rrJ0J_fi3uef2YslR9xPZowdmKaIVnKE7ZcXWwkkNnUrZm8So4_FWYYdehfAKp0fXMnVKLQ


大家好我是劉歧,目前和幾個(gè)朋友一起創(chuàng)辦了視頻云創(chuàng)作平臺OnVideo,主要負(fù)責(zé)做一些新功能預(yù)研和整體方向把控。


今天主要從四個(gè)方面來介紹一下FFmpeg的濾鏡深度應(yīng)用:


1. ?Filter基本原理

2. ?Filter使用方法

3. ?Filter開發(fā)基礎(chǔ)

4. ?Filter開發(fā)


一. ?Filter基本原理


基本原理的理解可以從以下六點(diǎn)出發(fā):


  • 線性屬性:濾鏡是一個(gè)線性的屬性,是一步接著一步的往下走的,當(dāng)然也可以有多線程的,但是多線程的實(shí)現(xiàn)不是特別好,一般的實(shí)現(xiàn)都是通過單線程來線性處理的。

  • 輸入輸出標(biāo)簽:濾鏡都有輸入和輸出的標(biāo)簽。

  • 濾鏡名

  • 濾鏡參數(shù):當(dāng)我們在使用某一類濾鏡時(shí),需要知道對應(yīng)的參數(shù)大小,如位置,寬高等。

  • 內(nèi)置變量:在使用濾鏡時(shí),可以用到它的很多內(nèi)置變量,如幀率,PTS等,這些變量可以在命令行中使用,在調(diào)用API時(shí)也會(huì)用到。

  • 壓縮前、解壓后的YUV/RGB/PCM數(shù)據(jù):對數(shù)據(jù)進(jìn)行濾鏡處理時(shí)使用的都是原始數(shù)據(jù),也就是未壓縮的數(shù)據(jù)。



  • 線性處理圖解

    ?

    如上圖所示,從濾鏡線性處理圖中可以看出,對每一個(gè)的濾鏡處理過程必須要有輸入和輸出,比如在最后濾鏡8的位置沒有輸出1來承接它的結(jié)果,則會(huì)報(bào)錯(cuò)。另外,如從濾鏡1到濾鏡2的過程,濾鏡1的輸出Out可以作為濾鏡2的輸入In,從濾鏡2再往后,濾鏡2的輸出Out可以分為兩部分,分別作為其它濾鏡處理的輸入。



    原始數(shù)據(jù)處理

    ?

    濾鏡的處理都是基于原始數(shù)據(jù)來進(jìn)行的,比如視頻圖像的每一幀,當(dāng)然也包括音頻。如上圖所示,每一幀可以有前后的多個(gè)層,一般情況下是兩層,當(dāng)有多層時(shí),如Frame1是三層,則可以先處理前兩層,處理之后合并成一層,再跟另一層一起去做處理。當(dāng)處理完Frame1后送到編碼器進(jìn)行編碼,再依次處理Frame2、Frame3、Frame4,處理完后均送到編碼器進(jìn)行壓縮編碼為另一個(gè)格式,比如H.264。


    二. ?Filter使用方法


    1. ?常用濾鏡


    常用的濾鏡中重點(diǎn)的是:scale、trim、overlay、yadif、rotate、movie

    比如常用的scale 可以用來做縮放,trim可以做比較精確的幀級的剪切,overlay可以來實(shí)現(xiàn)視頻混流,畫中畫或多畫面等疊加處理,rotate來做旋轉(zhuǎn),movie可以加載第三方的視頻等等,yadif可以在攝像機(jī)上做隔行掃描,在PC端的播放器可以做去交錯(cuò)。另外,還有delogo、crop、colorkey、chromakey、zoompan; delogo可以用來模糊化某一區(qū)域,crop用于圖像區(qū)域剪切,colorkey和chromakey是用于摳圖的,chromakey以YUV輸入為主,colorkey以RGB輸入為主,zoompan可以將圖像放大。


    2. ?命令行


    ffmpeg -filters



    通過這一命令,可以列出所有的濾鏡,但需要弄清楚每一個(gè)濾鏡的作用,比如上圖的adelay,它的作用是音頻轉(zhuǎn)音頻,延緩一個(gè)或更多的音頻通道。在濾鏡參數(shù)里面還包括timeline support、slice threading、command support,等在后面也會(huì)有介紹。


    ffmpeg -h filters=rotate



    當(dāng)某個(gè)濾鏡不知道它里面都有什么參數(shù)或者參數(shù)怎么用時(shí),那么可以通過上面這條help命令去查看濾鏡的內(nèi)容。比如在上圖,查看旋轉(zhuǎn)(rotate)濾鏡,可以看出它支持slice threading,而在最下面可以看到還支持timeline操作,并且輸入和輸出都是Video格式,再下面就是rotate的一些參數(shù),值得注意的是,在FFmpeg里面,尤其濾鏡這部分,為了讓大家在輸入?yún)?shù)時(shí)候更簡單,它會(huì)把很長的參數(shù)提供一個(gè)簡化的名稱。


    命令行的使用開頭都是:filter_complex,然后再在后面接一些字符串,如下:


    下面列出幾個(gè)例子的命令行使用:


    1. ?跑馬燈


    [0:v][1:v]overlay=x='if(gte(t,0),?-w+(mod(n,?W+w))+5,?NAN)':y=0[out]


    應(yīng)用場景如新聞播放時(shí)畫面下方的小欄預(yù)告,從右跑到左。


    2. ?圖像旋轉(zhuǎn)


    [1:v]rotate=a=60*PI/180:ow=180:oh=180[v1];[0:v][v1]overlay=x=-20:y=-20[o]


    3.??delogo(模糊化某一區(qū)域)


    delogo=x=72:y=32:w=168:h=86:band=1:show=1


    下圖為以上三條命令行處理后的展示效果:

    ?


    在FFmpeg的ffplay里可以通過dumpgraph對濾鏡的處理過程增加更深的了解,可以看看下面這個(gè)例子:


    ./ffplay?-dumpgraph?1?-f?lavfi?"movie=a.flv[l];movie=logo.png[r];[l][r]overlay=x=0:y=0"



    在濾鏡處理的過程中是先加載第一個(gè)電影,然后再加載一張PNG圖片,為了疊加處理比較方便會(huì)先將它們轉(zhuǎn)換成YUV,再進(jìn)行疊加運(yùn)算,最后輸出到一個(gè)buffersink中。


    3. ?API


    濾鏡Filter的API結(jié)構(gòu)包括:



    AVFilterContext:濾鏡的上下文

    AVFilterInOut:濾鏡的輸入、輸出

    AVFilterGraph:濾鏡的圖結(jié)構(gòu)

    AVFilter:濾鏡的具體處理類

    AVFilterPad:包括輸入的Pad和輸出的Pad


    調(diào)用API的分為兩個(gè)大的步驟:


    第一步,濾鏡的初始化



    初始化部分首先要確定In的Buffer和Out的Buffersink,接下來就是創(chuàng)建一個(gè)濾鏡的Graph,再就是做一個(gè)濾鏡的解析,最后就是通用配置。


    第二步,濾鏡處理



    濾鏡處理過程是先解碼,解碼之后將幀加入到Buffer,再調(diào)用濾鏡處理模塊,處理之后輸出到Buffersink。


    濾鏡API的使用方法跟之前命令行的使用方法是一樣的,只是略微有一點(diǎn)差別。如果我們不會(huì)使用多輸入多輸出的方式,對于API的使用實(shí)際上它的輸入也可以用字符串處理的方式,就是命令行里邊的處理方式,如以下官方demo的代碼:


    跑馬燈


    [0:v][1:v]overlay=x='if(gte(t,0),?-w+(mod(n,?W+w))+5,?NAN)':y=0[out]




    圖像旋轉(zhuǎn)


    [1:v]rotate=a=60*PI/180:ow=180:oh=180[v1];[0:v][v1]overlay=x=-20:y=-20[o]



    Delogo(模糊化某一區(qū)域)

    ?

    delogo=x=72:y=32:w=168:h=86:band=1:show=1



    從上面的介紹可以看出,命令行與API實(shí)質(zhì)上并沒有太大的區(qū)別。


    三. ?Filter開發(fā)基礎(chǔ)


    1. ?Module結(jié)構(gòu)



    在上面的Module結(jié)構(gòu)里面,可以很清晰的看出步驟流程,先要在濾鏡的類里面注冊它所對應(yīng)的所有信息,如濾鏡名,上下文等等;下一步就是對Input和Output的處理,對幀的濾鏡處理正常都是在一個(gè)Input里面處理的;



    再就是要看濾鏡是否支持Timeline,比如做一些動(dòng)態(tài)的變量,跑馬燈之類的,也要有時(shí)間線的概念。在這個(gè)里面也有一些對應(yīng)的內(nèi)置函數(shù),可以把他們理解為一些數(shù)字運(yùn)算的接口。以及下面還有一些變量名的定義。



    2. ?加入到FFmpeg中


    添加濾鏡的時(shí)候,主要是往下面兩個(gè)里面添加:


    ?


    四. ?Filter開發(fā)


    在這一部分,為大家做了FFMPEG添加新濾鏡的過程的錄像,錄像地址為http://bbs.chinaffmpeg.com/add_filter.mp4,有興趣的同學(xué)可以看一下



    首先建立了一個(gè)zoomscale的濾鏡文件,建立完這個(gè)文件之后,創(chuàng)建對應(yīng)的context,然后把剛才講到的那些接口都寫進(jìn)來,定義zoomscale公共的類,下面我們實(shí)現(xiàn)了一個(gè)filter _frame,它會(huì)把里面的input給釋放掉,讓它變成一個(gè)NULL,此時(shí)顯示的前景圖像就會(huì)變成一個(gè)純綠色的圖像,如果說這里有process commode,那么就可以在做zmq的時(shí)候用,如果沒有的話,可以留空。關(guān)鍵是filter_frame,可以當(dāng)作濾鏡處理的一個(gè)入口,而get_video_buffer可以把它理解為我們看到的很多demo里面寫到的get_video_buffer,即創(chuàng)建一個(gè)幀的對應(yīng)Buffer,將其添加至Makefile之后,繼續(xù)添加一個(gè)avfilter。這是FFmpeg4.0之前的版本,在后面新版本里面,采用的是數(shù)組的形式,也就沒有列表那么麻煩,速度會(huì)更快一些,添加完之后,可以通過config進(jìn)行查看配置,每次config完之后,會(huì)有整體的一個(gè)輸出。添加完成后,進(jìn)行編譯,之后可以在avfilter庫里直接查看濾鏡是否已經(jīng)加到FFmpeg的應(yīng)用程序里,然后調(diào)用API部分,直接把字符串傳進(jìn)來就可以使用了。


    Q&A:


    Q1:直播實(shí)時(shí)應(yīng)用濾鏡怎么處理?


    A:只要性能跟的上就可以,比如說通過濾鏡里可以添加OpenCV,或者OpenGL的方式。如果原來是直接調(diào)用OpenGL,想更加方便,在FFmpeg里進(jìn)行處理的話,可以把它添加到FFmpeg的濾鏡里面,實(shí)現(xiàn)對應(yīng)的OpenGL方法,再調(diào)方法即可。


    Q2:在FFmpeg里面濾鏡處理都是線性的嗎?


    A:介紹是這樣的,通過代碼的演示可以看到濾鏡的處理是一步一步進(jìn)行的,處理完一幀,再處理下一幀。接口的調(diào)用也是如此。



    總結(jié)

    以上是生活随笔為你收集整理的刘歧:FFmpeg Filter深度应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。