英特尔DevKit搭建RTMP及OpenVINO视频处理
本文以一个超分模型为例,将AI推理应用于这样一个流媒体服务器中,这主要也是给广大开发者提供了这样一个思路,可以将例如人脸检测,分割,或者识别模型同样部署于流服务器中,利用AI模型将推流出来的视频经过AI处理,这样就能给一个普通的视频流服务器进行AI赋能。RTMP流媒体服务器在市面上的应用十分广泛,除了点对点的视频传播,像现在非常热门的网络直播,都可以通过这样一个服务器达到自动播放视频,自动处理视频
这里将会介绍如何使用英特尔®认证的DevKit——艾克斯开发板快速搭建RTMP流媒体服务器,并利用FFmpeg*实现视频推流的功能。由于FFmpeg后端支持OpenVINO™赋能,所以在视频推流的基础上,我们可以部署AI模型实现对视频流的AI处理。并且,我们将充分利用CPU所携带的集成显卡(iGPU)进行视频的编解码加速和AI 推理。图1:Intel®DevKit RTMP推流服务器项目流程图
项目介绍:通过FFmpeg读取摄像头视频流、本地视频或者网络视频并解码,解码后调用FFmpeg包含的视频处理功能,包括了视频剪辑,视频拼接,视频水印等等,并且能够支持OpenVINO™工具套件作为后端对输入视频进行AI处理。由于FFmpeg可以兼容软硬编解码库,所以可以选择CPU或者集成显卡(iGPU)加速视频的编解码等功能。最后将处理完成的视频通过FFmpeg推流至在本地搭建好的RTMP流媒体服务器(Simple Realtime Server)中。若在局域网中,客户可以根据IP地址,直接拉取视频流进行观看。若在公网中,该视频流将传输至公开视频流网站,通过公网节点进行广播。
英特尔®认证 DevKit——艾克斯开发板简介图2:艾克斯板硬件参数 图3:艾克斯板实物拍摄
英特尔®认证的DevKit——AIxBoard(爱克斯板*)开发板是专为支持入门级边缘AI应用程序所设计的嵌入式硬件,它能够满足开发者对于人工智能学习、开发、实训等应用场景的使用需求。
基于x86平台所设计的开发板,可支持Linux Ubuntu及 完整版Windows操作系统,很方便开发者进行软硬件开发,以及尝试所有x86平台能够应用的软件功能。开发板搭载一颗英特尔®赛扬®N5105 4核4线程处理器,睿频可达2.9 GHz,且内置英特尔® 超核芯显卡,集成显卡运行频率为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实时插补控制都能稳定运行。可作为边缘计算引擎用于人工智能产品验证、开发;也可以作为域控核心用于机器人产品开发。
英特尔®DevKit的x86架构可以支持完整的Windows系统,不需要特殊优化就能直接获得Visual Studio、OpenVINO™、OpenCV等最强大的软件支持,最成熟的开发生态,数百万的开源项目,给你的创意提供更多助力。无论您是一个DIY的狂热爱好者、交互设计师还是机器人专家,都可以玩转开发板进行创意开发工作。
实时消息传递协议(RTMP)
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 端口,这需要特殊的防火墙修改才能允许通过被阻止的网络。图4:基于RTMP协议的视频流框架
基于RTMP协议进行视频的推拉流传输,我们需要一个中继视频流服务器来进行RTMP流的分发,这样一方面既能保证推流的稳定性,另一方面也方便管理员对视频流进行监督管理。
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
通过编译安装这样一个开源的流媒体服务器,我们可以节省开发成本,实现快速部署流媒体服务器,并进行视频推流。
FFmpeg 集成OpenVINO™推理引擎
FFmpeg 介绍
FFmpeg即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:图5:FFmpeg软件架构图
FFmpeg集成OpenVINO™ Toolkit
OpenVINO™是Intel发布的一套深度学习框架,支持多种模型文件格式,包括Tensorflow、 Caffe、ONNX、MXNet、Kaldi和Torch*等,也支持各种Intel硬件,包括CPU、GPU、FPGA、Movidius™神经计算棒等。由于FFmpeg要求调用的库必须提供C API,而刚好OpenVINO™在2020年发布版本中增加了这样的接口。再加上OpenVINO™后端相对于TensorFlow后端可以提供更多的模型格式支持,而且可以更多更好的支持各种底层硬件。所以,FFmpeg社区接受了OpenVINO™中的推理引擎作为一个新的深度学习后端。图6:AVFilter内部架构图
在AVFilter中,我们将会集成OpenVINO™的推理引擎作为DNN interface的后端进行使用。目前,FFmpeg中没有基于深度学习模型的图像分析的filter,只有图像处理的通用filter,即dnn_processing,也因此我们使用dnn_processing作为演示的例子:
dnn_processing=dnn_backend=openvino:model=<YOUR PATH OF espcn.xml>
由于在默认编译选项下,FFmpeg没有OpenVINO™后端支持库,所以,在本例中需要开发者重新编译FFmpeg,将libopenvino集成到FFmpeg的内置库中。这里也感谢郭叶军老师将OpenVINO的C接口并入FFmpeg的enable库中,使得FFmpeg官方支持调用libopenvino.so库,接入OpenVINO引擎进行模型推理。开源地址:https://github.com/mattcurf/ffmpeg_openvino
项目流程
操作系统安装
艾克斯板官方操作手册(https://www.xzsteam.com/docs/ )上Linux OS安装的系统为Ubuntu 20.04,为了方便操作演示,我们选择使用图形界面的Ubuntu 20.04 操作系统进行演示。
若编解码压力过大,也可以选择不带图形化界面的server版Linux系统搭建流服务器。若你是其他系统版本的Linux, 本流程仅供参考。
搭建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 <your mp4/flv…>
-vcodec copy -acodec copy \
-f flv -y rtmp://<YOUR SERVER IP>/live/livestream; \
sleep 1; \
done
6、观看RTMP流。
RTMP流地址为:rtmp:///live/livestream
若系统没有VLC播放器,使用如下命令安装VLC播放器:
sudo apt-get install vlc
使用VLC播放器输入RTMP流地址,即可观看该视频流。
安装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 同时enable OpenVINO
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
运行流媒体服务器
运行RTMP流媒体 服务器
./objs/srs -c conf/rtmp.conf
-
用FFmpeg将USB Camera的实时画面流进行推流
for((;;)); do \
ffmpeg -f video4linux2 -i "/dev/video0" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://<YOUR server IP>/live/livestream;\
sleep 1; \
done
图7:摄像头视频流推流
-
通过FFmpeg将视频进行处理后进行推流
for((;;)); do \
ffmpeg -re -i <YOUR MP4 FILES> \
-vcodec copy -acodec copy \
-f flv -y rtmp:// <YOUR SERVER IP>/live/livestream; \
sleep 1; \
done
图8:推流MP4视频
-
视频多路拼接,以4路视频拼接为例:
for((;;)); do \
ffmpeg -re -i <video1> -i <video2> \
-i <video3> -i <video4> \
-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://<YOUR SERVER IP> /live/livestream; \
sleep 1; \
done
图9:推流4路MP4视频并拼接
-
视频增加水印
for((;;)); do \
ffmpeg -i <YOUR MP4 FILES> -i <YOUR LOGO> -filter_complex overlay \
-f flv -ar 44100 -y rtmp://<YOUR SERVER IP>/live/livestream; \
sleep 1; \
done
图10:推流视频并添加水印
-
使用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 <YOUR PATH OF 480p.mp4> -vf hwdownload,format=yuv420p,dnn_processing=dnn_backend=openvino:model=<YOUR PATH OF espcn.xml>:input=x:output=espcn/prediction:options=device=GPU,format=nv12,hwupload -c:v h264_vaapi \
-f flv -ar 44100 -y rtmp://<YOUR SERVER IP>/live/livestream; \
sleep 1; \
done
图11:480P的视频super-resolution 后成为 960P推流以及集成显卡占用情况/每秒帧率
FFmpeg 作为一款开源的视频处理软件,其后端兼容的软件工具网络多种多样,你可以探索接入各种视频处理后端,软硬件加速工具,以及自定义程序。 whaosoft aiot http://143ai.com
你也可以根据你的需求或者兴趣,利用FFmpeg、OpenVINO™工具套件和艾克斯开发板实现更多有创意的应用或者发明。如果你已经有了好的创意或者开发计划,可以通过填写开发计划说明来免费申请艾克斯开发板进行实验,详情请点击:5周年快乐,英特尔"走近开发者"活动免费领取开发者套件(https://mp.weixin.qq.com/s/pHp7lwqEsK9x8rqWhWir_A)
3.5 网络推流直播
在公网上进行视频推流,以斗鱼*网为例:网络直播现在当下是一个非常热门的领域,对于一般用户来说,他们会使用直播网站提供的直播伴侣软件进行直播,例如下图:图12:斗鱼网直播伴侣界面
基于RTMP服务器的建立,我们可以通过服务器推流的方式,将想要进行直播的摄像头视频流或者是存储于服务器的视频进行推流直播。在FFmpeg和OpenVINO™的加持下,我们也可以对要推的视频流进行编辑操作,赋予AI推理之类的能力,将处理过的视频进行推流直播。直播软件一般都会提供获取互联网资源的接入口,方便主播直接进行拉流。
局域网:
通过局域网IP,可以在内网对客户端进行推送处理过的视频流。
4 总结
英特尔®认证的DevKit—— 艾克斯开发板以Intel® Celeron™ N5105作为处理核心,在相同的功耗下获得了优秀的计算性能。在本例中,它作为一个小型的流媒体服务器,可以做到多路编解码,实时视频传输,以及在OpenVINO™工具套件的帮助下对视频进行AI处理后将视频进行推流。本文以一个超分模型为例,将AI推理应用于这样一个流媒体服务器中,这主要也是给广大开发者提供了这样一个思路,可以将例如人脸检测,分割,或者识别模型同样部署于流服务器中,利用AI模型将推流出来的视频经过AI处理,这样就能给一个普通的视频流服务器进行AI赋能。别忘了,如果你有好的创意,可以通过提交开发计划说明来免费申请艾克斯开发板进行实验,详情请点击:5周年快乐,英特尔"走近开发者"活动免费领取开发者套件(https://mp.weixin.qq.com/s/pHp7lwqEsK9x8rqWhWir_A)
RTMP流媒体服务器在市面上的应用十分广泛,除了点对点的视频传播,像现在非常热门的网络直播,都可以通过这样一个服务器达到自动播放视频,自动处理视频的效果,能够获得一定的商业价值。由于FFmpeg这样一个开源框架的自由度很高,只要是FFmpeg能够集成的功能,都可以很轻松地部署到服务器中,大家快来参与活动,申请板子开始创造实验吧。
更多推荐
所有评论(0)