在推理过程中,一个必要的步骤是将视频转换成一张张的图片。为了使用Atlas的硬件解码功能,我们选择使用ffmpeg的库完成这个相关的功能。
题图来自GitHub上一个非常棒的教程。
从题图中可以看出,在视频处理中主要分为4层(我自己的翻译):
- 协议层: HTTP,文件,RTMP,RTSP等
- 格式层: MP4,AVI,MKV等
- 编码层: H264,H265等等
- 像素层: YUV420,RGB等等
在推理应用中,我们选择使用ffmpeg帮我们处理协议层和格式层,使用DVPP完成编解码,使用NPU在像素层做推理。下图是推理中ffmpeg处理的主要流程:
省略了亿点点细节
DVPP
DVPP是Atlas上媒体处理专用的硬件单元,支持的操作可以参考官方文档[2]。
DVPP解码器调用流程:
- 创建解码器通道
- 创建一个线程并且将线程绑定到解码器通道
- 将处理图片的回调函数绑定到解码器通道
- 使用aclvdecSendFrame接口将H264码流发送给解码器
- 解码器解码成功后将图片传给用户在第三步3中设置的回调函数
需要注意的点:
- 解码器只接受Annex-B格式的码流,如果输入是AVCC格式,需要先转成Annex-B格式再传给解码器
- 不是每次调用aclvdecSendFrame都会立即得到一帧图片,可能多次调用后才能得到一帧图片
- 用户设置的回调函数必须尽快处理图片,否则会阻塞解码器