视频编码耗时长、编码帧发送失败…DVPP 视频编码问题典型案例分析
本文分享自华为云社区《DVPP媒体数据处理视频编码问题案例》,作者:昇腾 CANN。
DVPP(Digital Vision Pre-Processing)是昇腾 AI 处理器内置的图像处理单元,通过 AscendCL 媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括图像编解码、视频编解码、图像抠图缩放等。
本期就分享几个关于 DVPP 视频编码问题的典型案例,并给出原因分析及解决方法:
1. 参数设置不合理,导致视频编码耗时长或编码失败
2. 发送待编码帧成功,但视频编码无输出
3. 发送待编码帧失败
01 参数设置不合理,导致视频编码耗时长或编码失败
问题现象描述
视频编码耗时长或编码失败。运行编码应用进程后,使用 dvpp 的 proc 信息排查问题,步骤如下:登录运行编码应用进程的环境,在有读、写、执行权限的目录下执行 msnpureport -a 命令,导出 proc 日志信息。按导出时间,进入对应时间戳的目录下,打开“module_info\dev-os-0\dvpp\dvpp_proc.log”日志。proc 信息中关键信息含义如下:EncStart 表示启动编码的帧数,EndSuccessed 表示成功编码的帧数,Lost 和 Disc(Disacrd)表示编码失败的帧数,Recode 表示重编的次数。
1、日志中出现类似下面红框的信息:Lost 和 Disc 的数量为 0 或很低,但是 Recode 的数量比较大,表示大部分帧能够编码成功,但是重编次数太多。
2、日志中出现类似下面红框的信息:Lost 和 Disc 的数量比较大,同时 Recode 的数量也比较大,表示有比较多的帧编码失败了。
原因分析
视频编码耗时长或编码失败可能与编码缓冲区内存大小 buf_size 参数的设置有关,原理如下:当实际的编码结果大小大于编码缓冲区中的可用内存大小 buf_size 时,编码模块会自动调整参数重编,减小编码结果数据大小。如果重编次数全部用完,但是编码结果大小依然大于编码缓冲区中的可用内存大小,此时编码模块会将该帧丢弃。
因此 buf_size 设置的太小,缓冲帧数少,导致出现重编的概率高,进而导致编码时延增加,帧率变低,性能下降,甚至出现丢帧概率高的情况。
处理步骤
视频编码场景下,创建视频编码通道时,合理设置每个通道的 buf_size 参数,以节省内存使用开销,推荐将 buf_size 设置为:原图宽*原图高*3/2 后再 64 对齐,且取值范围:[32*1024, 1*1024*1024*1024],以 Byte 为单位。否则可能出现以下异常情况:
反复重编,进而导致编码时延变长、性能下降、图像质量下降;
编码失败,获取不到编码结果。
02 发送待编码帧成功,但视频编码无输出
现象描述
创建视频编码通道后,发送帧成功,但调用 hi_mpi_venc_get_stream 接口获取编码后码流数据时,返回值为 0xa008800e,获取不到编码后码流数据。
可能原因
发送帧成功,但获取编码后码流数据失败可能原因有以下:
用户传入的输入图像内存不是使用 dvpp 内存申请接口 hi_mpi_dvpp_malloc 申请的。
用户传入的输入图像内存大小和图像分辨率不匹配。
处理步骤
针对分析的可能原因,请参考以下方法处理:
1.查看日志是否有出现 watch_dog 相关的信息,如下图所示,若出现 watch_dog 信息,基本可以确认是内存使用存在问题。
2.排查应用代码中输入图像内存的申请方式,如果不是使用 dvpp 内存申请接口 hi_mpi_dvpp_malloc 申请的,视频编码时将无法正常访问该内存,导致编码无输出,需要修改为使用 hi_mpi_dvpp_malloc 申请输入图像内存。
3.排查应用代码中输入图像内存和分辨率是否匹配,比如 YUV420SP NV12 或 NV21 格式的 YUV 图像,一帧图像大小为宽*高*1.5,如果实际送给申请的输入图像内存大小比宽*高*1.5 小的话,会产生访问越界等不可预期的行为,也会导致编码无输出。需要保证申请的内存大小和实际设置的分辨率参数匹配。
03 发送待编码帧失败
现象描述
视频编码场景下,调用 hi_mpi_venc_send_frame 接口发送待编码帧,接口返回值非 0 值,表示发送帧失败。
可能原因
导致发送帧失败的可能原因有以下:
用户传入的图像帧参数不在规定的合理范围内或设置了暂不支持的参数。
用户送帧的频率太快,大于性能规格。
处理步骤
针对分析的可能原因,请参考以下方法处理:
1、如果返回值为 0xa0088003 或 0xa0088008,则说明用户传入的图像帧参数不在规定的合理范围内或设置了暂不支持的参数。
具体是哪个参数传入有问题可以进一步查看日志信息,如下图所示,是传入的 YUV 格式不正确。
常见参数设置问题如下:
(1)入参的结构体没有进行 memset 初始化,结构体的部分参数没有主动设置,导致这部分参数值是一些随机值;
(2)头文件不匹配,导致枚举类型传入和预期不符合;
(3)参数支持范围不了解,各个参数的支持范围可查看hi_mpi_venc_send_frame接口的详细介绍。
2、如果返回值为 0xa008800d,则说明视频编码的输入空闲队列已满,此时无法再继续往编码模块内部送入数据帧。
这种问题一般是由于送帧的频率太快,大于昇腾 AI 处理器的处理速度,导致输入队列堆积,视频编码的输入空闲队列长度为 6 帧,只要堆积到了 6 帧,再继续送帧就会报错。
这种情况,建议在应用代码中控制调用 hi_mpi_venc_send_frame 的时间间隔,比如编码帧率 30fps,调用的间隔可以控制在 33ms 一帧。
04 更多介绍
[1]昇腾文档中心
[2]昇腾社区在线课程
[3]昇腾论坛
号外
7 月 7 日,华为开发者大会 2023 ( Cloud )将拉开帷幕,并将在国内 30 多个城市、海外 10 多个国家开设分会场,诚邀您参加这场不容错过的年度开发者盛会,让我们一起开启探索之旅!
我们将携手开发者、客户、合作伙伴,为您呈现华为云系列产品服务与丰富的创新实践,并与您探讨 AI、大数据、数据库、PaaS、aPaaS、媒体服务、云原生、安全、物联网、区块链、开源等技术话题,展开全面深入的交流。
大会将汇聚全球科学家、行业领袖、技术专家、社区大咖,开设 200 多场开发者专题活动,为全球开发者提供面对面交流与合作的机会,共同探讨技术创新和业务发展。
大会官网:https://developer.huaweicloud.com/HDC.Cloud2023.html
参会购票:https://www.vmall.com/product/10086352254099.html?cid= 211761
点击参与开发者社区活动,观赏技术大咖秀、玩转技术梦工厂,有机会赢取 4000 元开发者礼包!
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/2c8144efb537f9484555fcd42】。文章转载请联系作者。
评论