天天看點

(原)ffmpeg過濾器開發和了解

最近學習了ffmpeg關于filter過濾器的開發,關于中間的幾個相關概念,我們先放在簡單介紹一下:

AVFilterGraph:幾乎完全等同與directShow中的fitlerGraph,代表一串連接配接起來的filter們.

AVFilter:代表一個filter.

AVFilterPad:代表一個filter的輸入或輸出口,等同于DShow中的Pin.隻有輸出pad的filter叫source,隻有輸入pad的tilter叫sink.

AVFilterLink:代表兩個連接配接的fitler之間的粘合物.

然後分别看下各自的結構定義

1,過濾器結構體定義:

2,過濾器輸入輸出pad結構體AVFilterPad介紹

3,過濾器執行個體上下文結構體AVFilterContext介紹

對于他們的關系,我們借用一下别人畫的這個圖:

(原)ffmpeg過濾器開發和了解

結合這個圖,我們來分析一下,過濾器直接的資料傳遞是怎麼樣的,什麼樣的過濾器需要在AVFilterPad結構體裡面定義filter_frame函數來做過濾器應該做的事情,什麼時候更加适合考慮把過濾器處理資料的事情放到AVFilter的activate函數裡面。

先說一下我個人的了解:針對隻有一個輸入流的過濾器,直接對過濾器中的唯一的一個幀原始資料進行處理的,例如scale這種的過濾器,我們更加合适把過濾器的事情放到pad裡面的filter_frame函數中來處理,而對于将多個輸入流的資料進行處理的過濾器,例如overlay(它必須有兩個輸入資料,main,overlay兩層),他更加适合将資料放到處理過程放入到avfilter的activate函數裡面,通過它來調用ff_framesync_activate函數,進而調用FFFrameSync中的on_event處理。