VENC Q&A
Q1:定码率下画面有呼吸效应
调节方法如下:
-
调大Gop,实际上是减少I帧,因为I帧Size大,变相每张Size可以多一点
-
强制设置qp-delta,强制干预I帧效果
-
加大点码率
-
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信息:

发现:
-
getframe帧率是没问题的,但编码帧率只有23帧多。
-
只有1路1080p编码,性能肯定没问题。
-
BlockCnt代表已接收到的不过由于当前还在处理上一张input picture从而rewind的input picture总数;这里BlockCnt已有一定数量堆积。
-
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 值。