离线视频推理(InferOfflineVideo)
本demo主要实现离线视频推理功能,针对输入的H264/H265数据,实现视频解码、图片格式转换、目标检测、抠图与缩放、属性检测、JPEG编码,主要涉及VDEC、VPC、JPEGE、模型推理等功能,业务流程如图1所示,demo的使用指导请参考功能根目录的Readme。
输入的H264/H265数据可来源于摄像头或通过ffmpeg解封装的视频文件(MP4文件),本样例以H264文件为样例。
获取方式
离线视频推理(InferOfflineVideo)获取地址:https://gitee.com/HuaweiAtlas/samples
功能解析
本demo的Graph业务流由7个Engine组成,使用了目标检测(vgg_ssd)和属性识别(resnet50)两个模型。Engine间的输入与输出端口连接关系如图2所示。
- StreamPuller
StreamPuller的数据来源主要包括以下两个方面:
- H264/H265格式的离线视频
通过文件系统函数打开视频文件,读取H264/H265数据到buff后发送给VDecEngine进行硬件解码。
- MP4、AVI等封装格式离线视频
通过ffmpeg命令行或API代码将MP4、AVI等封装格式解封装为H264/H265格式。
- 通过ffmpeg命令行:
ffmpeg -i infile.mp4 -an -vcodec libx264 -crf 23 outfile.h264
若通过命令行方式将MP4解封装为H264/H265文件,则后面解码流程与上面第1点处理流程相同。
- 本样例代码还实现了通过ffmpeg API代码将MP4、AVI等封装格式解封装为H264/H265文件。
主要涉及以下几个步骤,将读取出的H264/H265数据发送给vdec进行解码,ffmpeg的API接口调用流程如下:
- av_register_all
- avformat_open_input
- avformat_find_stream_info
- av_find_best_stream
- av_init_packet
- h264_mp4toannexbav_read_frame
- 通过ffmpeg命令行:
- H264/H265格式的离线视频
- VDecEngine
VDecEngine主要用于完成H264/H265视频流的解码,主要由初始化和周期解码两部分组成。
- 初始化:资源申请和创建,例如CreateVdecApi,创建H26*解码句柄,同时由于VDEC输出的是HFBC的格式,创建VPC句柄,用于将HFBC转换成YUV。
- 周期解码:周期性对发送过来的H264/H265进行解码,VDEC解码采用异步方式解码,调用VdecCtl传入原始数据,Matrix框架完成解码后,调用回调函数vdec_frame_return,将解码后的数据返回给用户,用户在vdec ctrl的入参中将回调函数注册给vdec模块。
本样例在回调函数中实现HFBC格式到YUV格式的转换,并将转换后的数据发送给下一个Engine。
- SSDDetection
实现SSD检测的推理和结果输出,包括分类ID,置信度和框位置。
- ObjectClassification
将目标检测的结果进行进一步详细分类,输出包括分类ID和置信度。
- JpegEncode
负责将解码过的YUV图片编码成JPEG图片。
- DstEngine
将Device侧的处理结果数据保存为文件和图片。