DVPP媒体数据处理视频编码问题案例

news/2024/11/17 17:48:46/

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信息,基本可以确认是内存使用存在问题。
    [Chnl]:chnl_watch_dog_timer_isr [Line]:1141 find VEDU_0  down,now reset it
    [Chnl]:chnl_watch_dog_blackbox [Line]:1097 vpu_id is 0, venc watchdog fail enter blackbx
  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、如果返回值为0xa00880030xa0088008,则说明用户传入的图像帧参数不在规定的合理范围内或设置了暂不支持的参数。

具体是哪个参数传入有问题可以进一步查看日志信息,如下图所示,是传入的YUV格式不正确。

[Venc]:hevc_check_pixel_format [Line]:1110 H.265 don't support format 5,should be NV12(1) or NV21(2)

常见参数设置问题如下

(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]昇腾论坛


http://www.ppmy.cn/news/402959.html

相关文章

RedisSon高并发分布式锁实战

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁,如果是分布式系统,跑在不同的虚拟机上的tomcat上,会导致synchronized无法锁住对象 ----------- 需要分…

【Android】Room数据库的使用

简介 Room 是在 SQLite 的基础上推出的 Android 库,它是 Google 官方对数据库操作的推荐方式。使用 Room 可以更方便、高效地操作 SQLite 数据库。 使用 添加依赖 在使用 Room 之前,需要在项目中添加 Room 相关的依赖。在 build.gradle 文件中添加以…

Java 小白 重写toString()方法将如下信息输出在控制台上,红色的苹果被称为“糖心富士”,每500克4.98元,买了2500克“糖心富士”,须支付多少钱

class Apple {public String toString(){return "红色的苹果被称为“糖心富士”,每500克4.98元,买了2500克“糖心富士”,须支付多少钱";}public static void main(String[] args){System.out.println(new Apple());} }

二:物理层

一:物理层基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层主要任务:确定与传输媒体接口有关的一些特性。 二:数据通信模型 通信的目的是传送消息。 两种数据传输方式;

百度网盘的登陆

登陆页面的具体细节还没有完善。 二维码移动: bool isMoveLight;public const int MOVE_STEP 10;private void P1_MouseEnter(object sender, EventArgs e){timer1.Enabled true;isMoveLight true;}private void Timer1_Tick(object sender, EventArgs e){if ((i…

zzulioj 1146: 吃糖果

题目描述 HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢连续两次吃一样的糖果,喜欢先吃一颗A种类的糖果,下一次换一种口味,吃一颗B种类的糖果,这样&…

Kotlin学习 - 数据类与单例类

数据类 在Java代码中,数据类通常需要重写equals()、hashCode()、toString()这几个方法。虽然有快捷方式可以自动生成,但是还是要我们去点击生成下,并且一个简单的数据类就算没有其他复杂逻辑看着也挺繁琐的,代码如下:…

青桔文案:销售青桔水果文案

水果店线上营销文案大全,帮助水果店线上运营,优质全面的水果文案,让发文案不再词穷。目前已更新水果文案5800多条,共280多类水果。 1、怎么找到这些文案 如果想要这些文案,在朋友圈下有个搜一搜功能,直接搜…