[FFmpeg濾鏡增強(qiáng)能力]在FFmpeg中使用OpenGL 自定義Shader渲染視頻媒體素材

O 背景

相信很多人不滿足于FFmpeg已有的Filters池充,對于現(xiàn)有FFmpeg支持Animation動(dòng)畫能力很不滿足
確實(shí),F(xiàn)Fmpeg本身的Filter濾波器并非為動(dòng)畫而作旋膳,而是核心服務(wù)于編解碼/轉(zhuǎn)碼的用戶需求
同時(shí)我們也知道,OpenGL作為動(dòng)畫 2D/3D特效算法開發(fā)的首選能力途事,正好可以彌補(bǔ)FFmpeg對于特效渲染的短板验懊。

今天要給的解決方案:如何在FFmpeg Cmd中使用 OpenGL 自定義 Shader 渲染視頻媒體素材。

主要介紹 FFmpeg-Plus-OpenGL 濾鏡對于這個(gè)困境的解決方案尸变。


1 FFmpeg-Plus-OpenGL

濾鏡:https://github.com/numberwolf/FFmpeg-Plus-OpenGL

FFmpeg-Plus-OpenGL 是一個(gè) FFmpeg 下支持OpenGL的擴(kuò)展濾波器义图,此項(xiàng)目為一個(gè)Patch,可以直接將濾鏡編譯到自己的FFmpeg4+(FFmpeg3的濾鏡 Patch有所不同召烂,略微更改即可)

source render
image.png
image.png


使用步驟如下

安裝 編譯

  • 相關(guān)依賴

    • Centos 7.x+ || Linux

      • 第一步 安裝相關(guān)依賴

        yum install -y glew*
        yum install -y glfw*
        
        #
        # If can not compile , you need
        #
        yum install -y libGLEW*
        yum install -y mesa
        yum install -y mesa-libGLU mesa-libGLU-devel
        
      • 第二步(可選)

        如果你在無顯卡環(huán)境下跑此濾鏡(比如你的生產(chǎn)環(huán)境服務(wù)器),需要xvfb的支持

        yum install -y xorg-x11-server-Xvfb
        
    • Ubuntu || Linux

      • 第一步 安裝相關(guān)依賴

        apt-get install libglfw3-dev libglfw3
        apt-get install libglew2.0 libglew-dev
        
      • 第二步(可選)

        如果你在無顯卡環(huán)境下跑此濾鏡(比如你的生產(chǎn)環(huán)境服務(wù)器),需要xvfb的支持

        apt-get install xvfb
        
    • MacOS下編譯 (需要brew支持)

      brew install glew glfw
      


  • 編譯構(gòu)建

    • 下載源碼

      git clone https://github.com/numberwolf/FFmpeg-Plus-OpenGL.git
      git clone https://github.com/FFmpeg/FFmpeg.git # for 4.x+
      
      cd FFmpeg
      
      #
      # Patch
      #
      cp ../FFmpeg-Plus-OpenGL/Plus-GL-Shader/vf_plusglshader.c libavfilter/
      git apply ../FFmpeg-Plus-OpenGL/Plus-GL-Shader/libavfilter.diff
      
    • 編譯

      • 編譯的必選項(xiàng) - 和此濾鏡相關(guān)

        --enable-opengl
        --extra-libs='-lGLEW -lglfw'
        --enable-filter=plusglshader

      • 編譯示例 - 可以不參考此示例碱工,但是必須加上必選項(xiàng)

        #!/bin/bash
        ./configure \
          --enable-cross-compile \
          --pkg-config-flags="--static" \
          --extra-ldflags="-lm -lz -llzma -lpthread" \
          --extra-libs=-lpthread \
          --extra-libs=-lm \
          --enable-gpl \
          --enable-libfdk_aac \
          --enable-libfreetype \
          --enable-libmp3lame \
          --enable-libopus \
          --enable-libvpx \
          --enable-libx264 \
          --enable-libx265 \
          --enable-libass \
          --enable-libfreetype       \
          --enable-libfontconfig     \
          --enable-libfribidi        \
          --enable-libwebp           \
          --enable-nonfree \
          --disable-shared \
          --enable-static \
          --enable-opengl \
          --extra-libs='-lGLEW -lglfw' \
          --enable-filter=plusglshader
        make clean
        make -j16
        make install
        


運(yùn)行

  • 檢查 Plus-GL-Shader:plusglshader 濾鏡是否安裝成功

    • 檢查命令

      ffmpeg -help filter=plusglshader
      
    • 正確輸出

      ffmpeg version a0d68e65 Copyright (c) 2000-2020 the FFmpeg developers
        built with Apple LLVM version 10.0.0 (clang-1000.10.44.4)
        configuration: --enable-cross-compile --pkg-config-flags=--static --extra-ldflags='-lm -lz -llzma -lpthread' --extra-libs=-lpthread --extra-libs=-lm --enable-gpl --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libx264 --enable-libx265 --enable-libass --enable-libfreetype --enable-libfontconfig --enable-libfribidi --enable-libwebp --enable-nonfree --disable-shared --enable-static --enable-opengl --extra-libs='-lGLEW -lglfw' --enable-filter=plusglshader
        libavutil      56. 51.100 / 56. 51.100
        libavcodec     58. 91.100 / 58. 91.100
        libavformat    58. 45.100 / 58. 45.100
        libavdevice    58. 10.100 / 58. 10.100
        libavfilter     7. 85.100 /  7. 85.100
        libswscale      5.  7.100 /  5.  7.100
        libswresample   3.  7.100 /  3.  7.100
        libpostproc    55.  7.100 / 55.  7.100
      Filter plusglshader
        Generic OpenGL shader filter
          Inputs:
             #0: default (video)
          Outputs:
             #0: default (video)
      plusglshader AVOptions:
        sdsource          <string>     ..FV...... gl fragment shader source path (default is render gray color)
        vxsource          <string>     ..FV...... gl vertex shader source path (default is render gray color)
      
      This filter has support for timeline through the 'enable' option.
      
  • 使用plusglfilter轉(zhuǎn)碼渲染 (Transcoding)

    plusglshader=sdsource='./test_shader.gl':vxsource='./test_vertex.gl'

    • 參數(shù)項(xiàng)

      • sdsource : Fragment shader file path (Default is gray)
      • vxsource : Vertex shader file path (Default is gray)
    • 濾鏡使用規(guī)則

      • plusglshader
      • plusglshader=sdsource='./test_shader.gl':vxsource='./test_vertex.gl'
    • 用你自己的Shader渲染

        1. Fragment shader

        Notice: playTime is timestamp, from 0 -> end

        uniform sampler2D tex;
        uniform float playTime;
        varying vec2 texCoord;
        void main() {
            gl_FragColor = texture2D(tex, texCoord * 0.5 + 0.5);
            float usePts = max(playTime, 0.4);
            float gray = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / (usePts * usePts);
            gl_FragColor.r = gray;
            gl_FragColor.g = gray;
            gl_FragColor.b = gray;
        }
        
        1. Vertex shader
        attribute vec2 position;
        varying vec2 texCoord;
        void main(void) {
            gl_Position = vec4(position, 0, 1);
            texCoord = position;
        }
        
    • 如果在無頭(無顯示器顯卡環(huán)境下)環(huán)境下使用

      你需要xvfb server支持,使用如下命令

      xvfb-run -a --server-args="-screen 0 1280x720x24 -ac -nolisten tcp -dpi 96 +extension RANDR" \
      ffmpeg -v debug \
      -i 1000p10s_9k.mp4 \
      -filter_complex "[0:v]plusglshader=sdsource='./test_shader.gl':vxsource='./test_vertex.gl'[1outgl];[1outgl]scale=1280:-2" \
      -vcodec libx264 \
      -an \
      -pix_fmt yuv420p \
      -y test.mp4
      
    • 在有頭(顯卡 顯示器)環(huán)境下運(yùn)行

      ffmpeg -v debug \
      -i 1000p10s_9k.mp4 \
      -filter_complex "[0:v]plusglshader=sdsource='./test_shader.gl':vxsource='./test_vertex.gl'[1outgl];[1outgl]scale=1280:-2" \
      -vcodec libx264 \
      -an \
      -pix_fmt yuv420p \
      -y test.mp4
      
    • 輸出示例

      Tag Src Dst
      Frame
      原圖
      渲染


2 相關(guān)幫助

FFmpeg編譯相關(guān)幫助


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奏夫,一起剝皮案震驚了整個(gè)濱河市痛垛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桶蛔,老刑警劉巖匙头,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仔雷,居然都是意外死亡蹂析,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門碟婆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來电抚,“玉大人,你說我怎么就攤上這事竖共◎眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵公给,是天一觀的道長借帘。 經(jīng)常有香客問我,道長淌铐,這世上最難降的妖魔是什么肺然? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮腿准,結(jié)果婚禮上际起,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好街望,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布校翔。 她就那樣靜靜地躺著,像睡著了一般灾前。 火紅的嫁衣襯著肌膚如雪防症。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天豫柬,我揣著相機(jī)與錄音,去河邊找鬼扑浸。 笑死烧给,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喝噪。 我是一名探鬼主播础嫡,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酝惧!你這毒婦竟也來了榴鼎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晚唇,失蹤者是張志新(化名)和其女友劉穎巫财,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哩陕,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡平项,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悍及。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽瓢。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖心赶,靈堂內(nèi)的尸體忽然破棺而出扣讼,到底是詐尸還是另有隱情,我是刑警寧澤缨叫,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布椭符,位于F島的核電站,受9級特大地震影響耻姥,放射性物質(zhì)發(fā)生泄漏艰山。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一咏闪、第九天 我趴在偏房一處隱蔽的房頂上張望曙搬。 院中可真熱鬧,春花似錦、人聲如沸纵装。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橡娄。三九已至诗箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挽唉,已是汗流浹背滤祖。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶籽,地道東北人匠童。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像塑顺,于是被迫代替她去往敵國和親汤求。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容