VENC Q&A

Q1:定码率下画面有呼吸效应

调节方法如下:

  1. 调大Gop,实际上是减少I帧,因为I帧Size大,变相每张Size可以多一点

  2. 强制设置qp-delta,强制干预I帧效果

  3. 加大点码率

  4. ISP 调整画面清晰度等,编码压力小些

Q2:venc绑到scl,如果不去调用MI_VENC_GetStream获取帧,发现串口下查看mi_venc时venc ch info的Fps_1s 显示为0;而调用MI_VENC_GetStream获取帧后,Fps_1s才有值,这是为什么?

没有获取帧,帧会堆积,venc就没有编码,fps自然是0,故是正常的现象。

Q3:创建编码通道时候,最大size如何确定?

最大width需要取使用到的最大值,height只需要满足width*height < max resolution即可,底层用max resolution分配buffer。比如一个用到的码流需要创建1280*1920的编码大小,而另一个大的使用场景是1080P前端信号接入的时候需要编码的大小是1920*1080,那么我们width取最大是1920,height使用1280,因为最大的resolution其实是1920*1280,而不需要按照1920*1920去创建编码通道,对应MI_U32 u32MaxPicWidth、MI_U32 u32MaxPicHeight参数分别设置1920和1280。

Q4:取流慢导致编码出现丢帧排查方法

查看venc proc信息:

发现:

  1. getframe帧率是没问题的,但编码帧率只有23帧多。

  2. 只有1路1080p编码,性能肯定没问题。

  3. BlockCnt代表已接收到的不过由于当前还在处理上一张input picture从而rewind的input picture总数;这里BlockCnt已有一定数量堆积。

  4. echo drop_out a d > /proc/mi_modules/mi_venc/mi_venc0代表所有通道编码完数据直接丢弃,下此命令后帧率恢复正常。

综上可以确定是取流慢导致。后面确认到是在取流时有加sleep导致,没开高精度时钟,sleep时间会比较久,从而导致取流不及时,拿掉sleep测试ok。

Q5:退出编码时,调用MI_VENC_DestroyChn失败,日志有如下打印:[MI ERR ]: MI_VENC_IMPL_DestroyChn[12167]: dev0 chn0 unable to stop err:0xa0022012

从日志打印的error错误码0xa0022012,对照错误码,后面的三位"012" 表示设备忙。

这个错误的原因是MI_VENC_DestroyChn内部先调用MI_VENC_StopRecvPic,但是在调用MI_VENC_StopRecvPic就返回失败了,返回的错误码就是打印的错误码。

这种情况就是通道的资源还有被占用着,检查是否没有释放掉mma的内存:要注意对应的get数据后,一定要记得MI_VENC_ReleaseStream掉。

Q6:如何查看当前venc模块的clk?

采用命令:

cat /sys/class/mstar/venc/ven_clock
cat /sys/class/mstar/venc/ven_clock_2nd
cat /sys/class/mstar/venc/ven_clock_axi

或者:

cat /sys/venc/ven_clock
cat /sys/venc/ven_clock_2nd
cat /sys/venc/ven_clock_axi

可以查看。

Q7:修改编码帧率(u32SrcFrmRateDen)为15帧,实际在venc proc 查到的帧率对应不起来,这是什么原因呢?

venc本身是不做帧率控制,u32SrcFrmRateDen是用作码率控制的,帧率控制都是通过sys bind 进行控制,具体请查看 MI_SYS_API 文档 MI_SYS_BindChnPort2 接口说明。

Q8:销毁venc dev8 chn0通道,venc dev0 chn0 通道也会被销毁。

因为venc模块目前没有针对dev0和dev8去区分chn,使用venc dev0及dev8时,需要使用不同的chn。

当dev0 chn0 被创建之后,dev8 chn0 会创建失败,这里不会有err的打印信息,但是会有如下wrn提示信息。

CamOsMutexInit already inited, L[MI WRN ]: _MI_VENC_AllocChnResHandle[4517]: chn0 is already created

Q9:venc 最大支持多少路编码?

目前最大h264+h265 18路编码,jpe 16路,总共支持34路编码。

Q10:可以直接编码 argb8888 格式的数据吗?

不行,支持格式如下: h26x:yuv420的nv12格式 jpeg:yuv420的nv12格式或 yuv422 的yuyv格式

Q11:venc模块有缩放功能吗?

没有,venc模块没有缩放功能,输入的分辨率是多少,编码分辨率就是多少,如果要修改编码的分辨率,需要改scl output w/h 值。