文章指導:方亮,郭葉軍
1本文目的
本文將會介紹如何使用英特爾開發者套件——愛克斯開發板快速搭建 RTMP 流媒體服務器,并利用 FFmpeg* 實現視頻推流的功能。由于 FFmpeg 后端支持 OpenVINO 賦能,所以在視頻推流的基礎上,我們可以部署AI模型實現對視頻流的 AI 處理。并且,我們將充分利用CPU所攜帶的集成顯卡(iGPU)進行視頻的編解碼加速和 AI 推理。
2項目簡介
圖:Intel DevKit RTMP 推流服務器項目流程圖
項目介紹:通過 FFmpeg 讀取攝像頭視頻流、本地視頻或者網絡視頻并解碼,解碼后調用FFmpeg包含的視頻處理功能,包括了視頻剪輯,視頻拼接,視頻水印等等,并且能夠支持 OpenVINO 工具套件作為后端對輸入視頻進行AI處理。由于 FFmpeg 可以兼容軟硬編解碼庫,所以可以選擇CPU或者集成顯卡(iGPU)加速視頻的編解碼等功能。最后將處理完成的視頻通過 FFmpeg 推流至在本地搭建好的 RTMP 流媒體服務器
(Simple Realtime Server)中。若在局域網中,客戶可以根據 IP 地址,直接拉取視頻流進行觀看。若在公網中,該視頻流將傳輸至公開視頻流網站,通過公網節點進行廣播。
2.1英特爾開發者套件——愛克斯開發板簡介
英特爾開發者套件—— AIxBoard(愛克斯板*)開發板是專為支持入門級邊緣 AI 應用程序所設計的嵌入式硬件,它能夠滿足開發者對于人工智能學習、開發、實訓等應用場景的使用需求。
基于 x86 平臺所設計的開發板,可支持 Linux Ubuntu 及完整版 Windows 操作系統,很方便開發者進行軟硬件開發,以及嘗試所有 x86 平臺能夠應用的軟件功能。開發板搭載一顆英特爾賽揚N5105 4核4線程處理器,睿頻可達2.9GHz,且內置英特爾 超核芯顯卡,集成顯卡運行頻率為450MHz至800MHz,含有24個執行單元,分辨率最大支持4K60幀,同時支持英特爾Quick Sync Video 技術可以快速轉換便攜式多媒體播放器的視頻,還能提供在線共享、視頻編輯及視頻制作功能。板載 64GB eMMC存儲及LPDDR4x 2933MHz
(4GB/6GB/8GB), 內置藍牙和 Wi-Fi模組,支持USB 3.0、HDMI視頻輸出、3.5mm音頻接口,1000Mbps 以太網口。板子的接口豐富,還可以外拓各種傳感器模塊。
此外, 其接口與 Jetson Nano 載板兼容,GPIO 與樹莓派兼容,能夠最大限度地復用樹莓派、Jetson Nano 等生態資源,無論是攝像頭物體識別,3D 打印,還是 CNC 實時插補控制都能穩定運行。可作為邊緣計算引擎用于人工智能產品驗證、開發;也可以作為域控核心用于機器人產品開發。
英特爾開發者套件的 x86 架構可以支持完整的 Windows 系統,不需要特殊優化就能直接獲得 Visual Studio、OpenVINO、OpenCV 等最強大的軟件支持,最成熟的開發生態,數百萬的開源項目,給你的創意提供更多助力。無論您是一個 DIY 的狂熱愛好者、交互設計師還是機器人專家,都可以玩轉開發板進行創意開發工作。
2.2實時消息傳遞協議(RTMP)
2.2.1 RTMP 介紹
實時消息傳遞協議的全稱是Real-Time Messaging Protocol (RTMP)。簡單地說,流媒體協議就是在兩個通信系統之間傳輸多媒體文件的一套規則,它定義了視頻文件將如何分解為小數據包以及它們在互聯網上傳輸的順序。RTMP 是一個比較常見的流媒體協議,RTMP 由 Macromedia 進行開發,用于流式傳輸到 Flash 播放器,但是隨著 Flash 開始被淘汰并且基于 HTTP 的協議成為流式傳輸到播放設備的新標準,RTMP 在流媒體協議中應用范圍逐漸收窄。但是絲毫不影響 RTMP 的使用,在端對端的視頻流直播中它仍然占有很大的優勢!
RTMP 使用獨占的 1935 端口,基于 TCP 協議,在不需要緩沖的情況下,實現了低延時的特點,并且協議連接穩定。用戶在觀看視頻的時候,若網絡發生斷開,用戶重連后可以基于上次的斷開點繼續播放。RTMP 的整合靈活度很強,不僅可以整合文本、視頻和音頻,還可以支持 MP3 和 AAC 音頻流、 MP4、FLV 和 F4V 視頻流。
但是,RTMP 也有一些不足,比如不支持高分辨率視頻和 VP9、AV1 等視頻壓縮方法,像 iOS,Android、大多數嵌入式播放器和一些瀏覽器現在已經不再接受 RTMP 直播,某些網絡默認阻止 RTMP 端口,這需要特殊的防火墻修改才能允許通過被阻止的網絡。
基于 RTMP 協議進行視頻的推拉流傳輸,我們需要一個中繼視頻流服務器來進行 RTMP 流的分發,這樣一方面既能保證推流的穩定性,另一方面也方便管理員對視頻流進行監督管理。
2.2.2 Simple Realtime Server (SRS)
SRS* 是一個簡單高效的實時視頻流服務器,支持的協議包括了RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
支持的系統有 Linux/Windows/macOS, 芯片架構包括了
X86_64/ARMv7/AARCH64/M1/RISCV/LOONGARCH/MIPS。
你可以用它實現視頻推流,并且支持http回調事件(HTTP Callback),還可以保存視頻流文件。支持本地化部署,操作簡單。開源地址: https://github.com/ossrs/srs
通過編譯安裝這樣一個開源的流媒體服務器,我們可以節省開發成本,實現快速部署流媒體服務器,并進行視頻推流。
2.3FFmpeg 集成 OpenVINO 推理引擎
2.3.1 FFmpeg 介紹
FFmpeg 即是一款音視頻編解碼工具,同時也是一組音視頻編碼開發套件,作為編碼開發套件,它為開發者提供了豐富的音視頻處理的調用接口。
FFmpeg 提供了多種媒體格式的封裝和解封裝,包括多種音視頻編碼、多種協議的流媒體、多種多彩格式轉換、多種采樣率轉換、多種碼率轉換等;FFmpeg 框架提供了多種豐富的插件模塊,包含封裝與解封裝的插件、編碼與解碼的插件等。
FFmpeg 框架的基本組成包含 AVFormat、AVCodec、AVFilter、AVDevice、AVUtil 等模塊庫,結構圖如下:
圖:FFmpeg 軟件架構圖
2.3.2FFmpeg 集成 OpenVINO Toolkit
OpenVINO 是英特爾發布的一套深度學習框架,支持多種模型文件格式,包括 Tensorflow*、 Caffe*、ONNX*、MXNet*、Kaldi和Torch* 等,也支持各種英特爾硬件,包括 CPU、GPU、FPGA、Movidius 神經計算棒等。由于 FFmpeg 要求調用的庫必須提供 CAPI,而剛好 OpenVINO 在2020年發布版本中增加了這樣的接口。再加上 OpenVINO 后端相對于 TensorFlow 后端可以提供更多的模型格式支持,而且可以更多更好的支持各種底層硬件。所以,FFmpeg 社區接受了 OpenVINO 中的推理引擎作為一個新的深度學習后端。
圖:AVFilter 內部架構圖
在 AVFilter 中,我們將會集成 OpenVINO 的推理引擎作為 DNN interface 的后端進行使用。目前,FFmpeg 中沒有基于深度學習模型的圖像分析的 filter,只有圖像處理的通用 filter,即 dnn_processing,也因此我們使用
dnn_processing 作為演示的例子:
dnn_processing=dnn_backend=openvino:model=
向右滑動查看完整代碼
由于在默認編譯選項下,FFmpeg 沒有 OpenVINO 后端支持庫,所以,在本例中需要開發者重新編譯 FFmpeg,將 libopenvino 集成到 FFmpeg 的內置庫中。這里也感謝郭葉軍老師將 OpenVINO 的C接口并入 FFmpeg 的 enable 庫中,使得 FFmpeg 官方支持調用 libopenvino.so 庫,接入 OpenVINO 引擎進行模型推理。
開源地址:
https://github.com/mattcurf/ffmpeg_openvino
3項目流程
3.1
操作系統安裝
愛克斯板官方操作手冊上Linux OS 安裝的系統為Ubuntu 20.04,為了方便操作演示,我們選擇使用圖形界面的Ubuntu 20.04 操作系統進行演示。
若編解碼壓力過大,也可以選擇不帶圖形化界面的 server 版 Linux 系統搭建流服務器。若你是其他系統版本的 Linux, 本流程僅供參考。
3.2搭建 RTMP 流媒體服務器
搭建步驟:
1、獲取 srs 服務器源碼。
git clone https://github.com/ossrs/srs cd srs/trunk
向右滑動查看完整代碼
2、安裝依賴并編譯 srs 源碼。
sudo apt install -y automake tclsh ./configure && make
向右滑動查看完整代碼
3、編輯 srs 配置文件。
將以下內容保存為文件,譬如 conf/rtmp.conf,你可以根據自身需求對conf文件進行修改,服務器啟動時指定該配置文件(srs 的 conf 文件夾有該文件)。
# conf/rtmp.conf listen 1935; max_connections 1000; vhost __defaultVhost__ { }
向右滑動查看完整代碼
4、啟動 srs 服務器
./objs/srs -c conf/rtmp.conf
向右滑動查看完整代碼
5、啟動推流編碼器:
使用 FFMPEG 命令推流一個視頻至服務器端:
for((;;)); do ./objs/ffmpeg/bin/ffmpeg -re -i-vcodec copy -acodec copy -f flv -y rtmp:// /live/livestream; sleep 1; done
向右滑動查看完整代碼
6、觀看 RTMP 流。
若系統沒有 VLC 播放器,使用如下命令安裝 VLC 播放器:
sudo apt-get install vlc
向右滑動查看完整代碼
使用 VLC 播放器輸入 RTMP 流地址,即可觀看該視頻流。
3.3安裝 FFmpeg 并編譯 OpenVINO 工具包
1.安裝軟件依賴
apt-get install -y -q --no-install-recommends apt-utils build-essential ca-certificates cmake cpio curl git gnupg-agent libdrm-dev libpciaccess-dev libva-dev libx11-dev libsdl2-2.0 libsdl2-dev libx11-xcb-dev libxcb-dri3-dev libxcb-present-dev lsb-release nasm pkg-config software-properties-common wget xorg-dev xutils-dev clang libfdk-aac-dev libspeex-dev libx264-dev libx265-dev libnuma-dev libopencore-amrnb-dev libopencore-amrwb-dev yasm?
向右滑動查看完整代碼
2.安裝 OpenCL & VAAPI
curl -L https://repositories.intel.com/graphics/intel-graphics.key | sudo apt-key add - && apt-add-repository 'deb [arch=amd64] https://repositories.intel.com/graphics/ubuntu focal main' && apt-get update && sudo apt-get install -y -q --no-install-recommends clinfo intel-opencl-icd intel-media-va-driver-non-free
向右滑動查看完整代碼
3.安裝 OpenVINO 工具套件
curl -L https://registrationcenter-download.intel.com/akdlm/irc_nas/18319/l_openvino_toolkit_p_2021.4.752.tgz | tar xzf - #解壓縮tgz包 并安裝OpenVINO cd l_openvino_toolkit_p_2021.4.752 sudo ./install.sh #設置環境變量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/openvino_2021/inference_engine/lib/intel64:/opt/intel/openvino_2021/inference_engine/external/tbb/lib:/opt/intel/openvino_2021/deployment_tools/ngraph/lib
向右滑動查看完整代碼
4.編譯安裝 FFmpeg 并 enableOpenVINO
git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure --cpu=native --extra-cflags=-I/opt/intel/openvino_2021/inference_engine/include/ --extra-ldflags=-L/opt/intel/openvino_2021/inference_engine/lib/intel64 --extra-libs=-lpthread --disable-cuda-llvm --prefix=/usr --enable-static --disable-shared --enable-pic --disable-doc --disable-manpages --enable-libopenvino --enable-vaapi --enable-libx264 --enable-libx265 --enable-ffplay --enable-ffprobe --enable-gpl --enable-nonfree --enable-libxcb && make -j $(nproc) && sudo make install #清理build文件,添加VA變量 rm -rf /build && echo 'LIBVA_DRIVER_NAME=iHD' >>sudo /etc/environment && sudo ldconfig
向右滑動查看完整代碼
3.4運行流媒體服務器
運行 RTMP 流媒體服務器
./objs/srs -c conf/rtmp.conf
向右滑動查看完整代碼
用 FFmpeg 將 USBCamera 的實時畫面流進行推流
for((;;)); do ffmpeg -f video4linux2 -i "/dev/video0" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp:///live/livestream; sleep 1; done
向右滑動查看完整代碼
通過 FFmpeg 將視頻進行處理后進行推流
for((;;)); do ffmpeg -re -i-vcodec copy -acodec copy -f flv -y rtmp:// /live/livestream; sleep 1; done
向右滑動查看完整代碼
視頻多路拼接,以4路視頻拼接為例:
for((;;)); do ffmpeg -re -i-i -i -i -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w*1[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" -f flv -ar 44100 -y rtmp:// /live/livestream; sleep 1; done
向右滑動查看完整代碼
視頻增加水印
for((;;)); do ffmpeg -i-i -filter_complex overlay -f flv -ar 44100 -y rtmp:// /live/livestream; sleep 1; done
向右滑動查看完整代碼
使用 AI 處理視頻
使用 OpenVINO 工具套件作為 backend,對輸入視頻進行 AI 超分,下載所需的IR模型與測試視頻。AI 模型使用的是視頻超分模型 Efficient Sub-Pixel Convolutional Neural Network (ESPCN),了解模型更多信息,請至:https://arxiv.org/abs/1609.05158
wget https://raw.githubusercontent.com/guoyejun/dnn_processing/master/models/espcn.xml wget https://raw.githubusercontent.com/guoyejun/dnn_processing/master/models/espcn.bin wget https://raw.githubusercontent.com/guoyejun/dnn_processing/master/models/480p.mp4
向右滑動查看完整代碼
輸入視頻為480p 格式的 mp4 視頻,利用 VAAPI 將編解碼置于集成顯卡中進行,并且在集成顯卡中利用 VAAPI 對視頻編解碼進行加速。首先,硬解碼需要先 hwdonwload 到緩存中進行處理,通過 “dnn_processing” 讀入使用 OpenVINO 推理的ESPCN 模型,input/output 確定模型的輸入層和輸出層,“Device” 參數可以設置運行模型推理的設備,這里我們將其設置為 “GPU”,意思是使用集成顯卡進行模型推理,你也可以將其設置為 “CPU”,vfilters 工作結束之后 hwupload 進行封裝,最后,將超分完成的視頻進行推流:
for((;;)); do ffmpeg -y -loglevel warning -hide_banner -stats -benchmark -hwaccel vaapi -hwaccel_output_format vaapi -i-vf hwdownload,format=yuv420p,dnn_processing=dnn_backend=openvino:model= :input=x:output=espcn/prediction:options=device=GPU,format=nv12,hwupload -c:v h264_vaapi -f flv -ar 44100 -y rtmp:// /live/livestream; sleep 1; done
向右滑動查看完整代碼
FFmpeg 作為一款開源的視頻處理軟件,其后端兼容的軟件工具網絡多種多樣,你可以探索接入各種視頻處理后端,軟硬件加速工具,以及自定義程序。
你也可以根據你的需求或者興趣,利用 FFmpeg、OpenVINO 工具套件和愛克斯開發板實現更多有創意的應用或者發明。如果你已經有了好的創意或者開發計劃,可以通過填寫開發計劃說明來免費申請愛克斯開發板進行實驗,詳情請點擊:
3.5網絡推流直播
在公網上進行視頻推流
網絡直播現在當下是一個非常熱門的領域,對于一般用戶來說,他們會使用直播網站提供的直播伴侶軟件進行直播。
基于 RTMP 服務器的建立,我們可以通過服務器推流的方式,將想要進行直播的攝像頭視頻流或者是存儲于服務器的視頻進行推流直播。在 FFmpeg 和 OpenVINO 的加持下,我們也可以對要推的視頻流進行編輯操作,賦予 AI 推理之類的能力,將處理過的視頻進行推流直播。直播軟件一般都會提供獲取互聯網資源的接入口,方便主播直接進行拉流。
局域網:
通過局域網 IP,可以在內網對客戶端進行推送處理過的視頻流。
4總結
英特爾開發者套件 —— 愛克斯開發板以Intel Celeron N5105作為處理核心,在相同的功耗下獲得了優秀的計算性能。在本例中,它作為一個小型的流媒體服務器,可以做到多路編解碼,實時視頻傳輸,以及在 OpenVINO 工具套件的幫助下對視頻進行 AI 處理后將視頻進行推流。本文以一個超分模型為例,將AI推理應用于這樣一個流媒體服務器中,這主要也是給廣大開發者提供了這樣一個思路,可以將例如人臉檢測,分割,或者識別模型同樣部署于流服務器中,利用 AI 模型將推流出來的視頻經過AI處理,這樣就能給一個普通的視頻流服務器進行 AI 賦能。別忘了,如果你有好的創意,可以通過提交開發計劃說明來免費申請愛克斯開發板進行實驗。
RTMP 流媒體服務器在市面上的應用十分廣泛,除了點對點的視頻傳播,像現在非常熱門的網絡直播,都可以通過這樣一個服務器達到自動播放視頻,自動處理視頻的效果,能夠獲得一定的商業價值。由于 FFmpeg 這樣一個開源框架的自由度很高,只要是 FFmpeg 能夠集成的功能,都可以很輕松地部署到服務器中,大家快來參與活動,申請板子開始創造實驗吧。
-
英特爾
+關注
關注
61文章
10002瀏覽量
172115 -
服務器
+關注
關注
12文章
9277瀏覽量
85827 -
AI
+關注
關注
87文章
31399瀏覽量
269808 -
開發板
+關注
關注
25文章
5116瀏覽量
97917 -
開發者
+關注
關注
1文章
590瀏覽量
17054
原文標題:10分鐘用英特爾? 開發者套件搭建RTMP流媒體服務器并基于OpenVINO? AI賦能視頻處理?| 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論