点击蓝字
关注我们,让开发变得更有趣
以下文章来源英特尔物联网
文章作者:周兆靖 英特尔高级应用工程师
文章指导:方亮, 郭叶军
1
本文目的
本文将会介绍如何使用英特尔® 开发者套件——爱克斯开发板快速搭建 RTMP 流媒体服务器,并利用 FFmpeg* 实现视频推流的功能。由于 FFmpeg 后端支持 OpenVINO™ 赋能,所以在视频推流的基础上,我们可以部署AI模型实现对视频流的 AI 处理。并且,我们将充分利用CPU所携带的集成显卡(iGPU)进行视频的编解码加速和 AI 推理。
2
项目简介
图1:Intel® DevKit RTMP 推流服务器项目流程图
项目介绍:通过 FFmpeg 读取摄像头视频流、本地视频或者网络视频并解码,解码后调用FFmpeg包含的视频处理功能,包括了视频剪辑,视频拼接,视频水印等等,并且能够支持 OpenVINO™ 工具套件作为后端对输入视频进行AI处理。由于 FFmpeg 可以兼容软硬编解码库,所以可以选择CPU或者集成显卡(iGPU)加速视频的编解码等功能。最后将处理完成的视频通过 FFmpeg 推流至在本地搭建好的 RTMP 流媒体服务器
(Simple Realtime Server)中。若在局域网中,客户可以根据 IP 地址,直接拉取视频流进行观看。若在公网中,该视频流将传输至公开视频流网站,通过公网节点进行广播。
2.1
英特尔® 开发者套件——爱克斯开发板简介
图2:爱克斯板硬件参数
图3:爱克斯板实物拍摄
英特尔® 开发者套件—— 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 端口,这需要特殊的防火墙修改才能允许通过被阻止的网络。
图4:基于 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.3
FFmpeg 集成 OpenVINO™ 推理引擎
2.3.1
FFmpeg 介绍
FFmpeg 即是一款音视频编解码工具,同时也是一组音视频编码开发套件,作为编码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
FFmpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种多彩格式转换、多种采样率转换、多种码率转换等;FFmpeg 框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
FFmpeg 框架的基本组成包含 AVFormat、AVCodec、AVFilter、AVDevice、AVUtil 等模块库,结构图如下:
图5:FFmpeg 软件架构图
2.3.2
FFmpeg 集成 OpenVINO™ Toolkit
OpenVINO™ 是英特尔发布的一套深度学习框架,支持多种模型文件格式,包括 Tensorflow*、 Caffe*、ONNX*、MXNet*、Kaldi和Torch* 等,也支持各种英特尔硬件,包括 CPU、GPU、FPGA、Movidius™ 神经计算棒等。由于 FFmpeg 要求调用的库必须提供 CAPI,而刚好 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
3
项目流程
3.1
操作系统安装
爱克斯板官方操作手册
(https://www.xzsteam.com/docs/)上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 <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 流地址,即可观看该视频流。
3.3
安装 FFmpeg 并编译 OpenVINO™ 工具包
1.安装软件依赖
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
\
--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 将 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路视频拼接为例:
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 作为一款开源的视频处理软件,其后端兼容的软件工具网络多种多样,你可以探索接入各种视频处理后端,软硬件加速工具,以及自定义程序。
你也可以根据你的需求或者兴趣,利用 FFmpeg、OpenVINO™ 工具套件和爱克斯开发板实现更多有创意的应用或者发明。如果你已经有了好的创意或者开发计划,可以通过填写开发计划说明来免费申请爱克斯开发板进行实验,详情请点击:
5周年快乐,英特尔"走近开发者"活动免费领取开发者套件
3.5
网络推流直播
在公网上进行视频推流,以斗鱼*网为例:
网络直播现在当下是一个非常热门的领域,对于一般用户来说,他们会使用直播网站提供的直播伴侣软件进行直播,例如下图:
图12:斗鱼网直播伴侣界面
基于 RTMP 服务器的建立,我们可以通过服务器推流的方式,将想要进行直播的摄像头视频流或者是存储于服务器的视频进行推流直播。在 FFmpeg 和 OpenVINO™ 的加持下,我们也可以对要推的视频流进行编辑操作,赋予 AI 推理之类的能力,将处理过的视频进行推流直播。直播软件一般都会提供获取互联网资源的接入口,方便主播直接进行拉流。
局域网:
通过局域网 IP,可以在内网对客户端进行推送处理过的视频流。
4
总结
英特尔® 开发者套件 —— 爱克斯开发板以Intel® Celeron™ N5105作为处理核心,在相同的功耗下获得了优秀的计算性能。在本例中,它作为一个小型的流媒体服务器,可以做到多路编解码,实时视频传输,以及在 OpenVINO™ 工具套件的帮助下对视频进行 AI 处理后将视频进行推流。本文以一个超分模型为例,将AI推理应用于这样一个流媒体服务器中,这主要也是给广大开发者提供了这样一个思路,可以将例如人脸检测,分割,或者识别模型同样部署于流服务器中,利用 AI 模型将推流出来的视频经过AI处理,这样就能给一个普通的视频流服务器进行 AI 赋能。别忘了,如果你有好的创意,可以通过提交开发计划说明来免费申请爱克斯开发板进行实验,详情请点击:
5周年快乐,英特尔"走近开发者"活动免费领取开发者套件
RTMP 流媒体服务器在市面上的应用十分广泛,除了点对点的视频传播,像现在非常热门的网络直播,都可以通过这样一个服务器达到自动播放视频,自动处理视频的效果,能够获得一定的商业价值。由于 FFmpeg 这样一个开源框架的自由度很高,只要是 FFmpeg 能够集成的功能,都可以很轻松地部署到服务器中,大家快来参与活动,申请板子开始创造实验吧。
--END--
你也许想了解(点击蓝字查看)⬇️
➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能
➡️ 5周年更新 | OpenVINO™ 2023.0,让AI部署和加速更容易
➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能
➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型
➡️ 开发者实战系列资源包来啦!
➡️
以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️
还不知道如何用OpenVINO™作画?点击了解教程。
➡️
几行代码轻松实现对于PaddleOCR的实时推理,快来get!
➡️
使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理
➡️
图片提取文字很神奇?试试三步实现OCR!
➡️
【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务
➡️
使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能
扫描下方二维码立即体验
OpenVINO™ 工具套件 2023.0
本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。