欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于hi3516DV300的VDEC一些测试

程序员文章站 2022-04-30 11:31:10
...

VDEC是用于解码视频或者文件用于显示或其他途径的部件,常用操作是解码之后送入VPSS到VO,VDEC->VPSS->VO。支持的格式H264、h265、jpeg。

VDEC的整体设置比较简单,基本使用历程相关即可,解码方式支持三种,流式,即读取多少就送入多少解析,但是这样由于不是完整的帧(GOP),VDEC不会立即有效果,只有等一个完整的GOP输入之后才会有输出,这是最简单的一种,按帧发送,即每次发送的都是完整的GOP,VDEC会立刻进行解析并输出,兼容模式就像流式发送,但是需要用户自己判断结束,结束帧位置需要bEndOfFrame。综上,最简单的方式其实就是流式发送,只需要保证数据正确就行。关于视频内存,有两种,第一种HI_MPI_VB_CreatePool设置公共视频缓存池,另外一种就是在初始化VB的时候,计算好一个内存池,通过HI_MPI_VDEC_AttachVbPool绑定到指定的池子上。另外在需要特别注意的是,解码模式,IPB,IP,I,在3516DV300上不支持解B帧,所以送入解码的视频只能是IP帧。其余设置没有特别需要注意的地方。在获取数据之后通过填充VDEC_STREAM_S,然后调用HI_MPI_VDEC_SendStream发送到VDEC中,VDEC会根据出事配置进行相关工作。

这里使用的平台的hi3516DV300,配置H264,流式发送,基本在历程上没有修改。

首先测试的是海思再带历程中的1080P.H264文件,可正常播放。

选取一个普通的MP4视频或AVI视频,MP4/AVI这种都只是数据流的封装(mux),称不上格式一类。使用ffmpeg提取视频(demux).

ffmpeg -i test.mp4 out.h264

这是最简单的提取方式,但是中间一般会有很多问题,比如分辨率,IPB帧,GOP长度等,由于测试平台不支持B帧,需要在提取的时候设置,这里设置一个分辨率800*600,这里设置分辨率主要是为了展示的时候不变形,也可以不设置分辨率,主要看VDEC怎么配置,如果VDEC的输出分辨率大于VO会被缩放导致变形,最好耗时输入源视频的分辨率是匹配的。

ffmpeg -i test.mp4 -s 800*600 -x264opts bframes=0 out.h264

 这里输出的H264流是不包含B帧的,但是用于测试的时候,发现VDEC无法解析,显示到VO上的一直在闪烁,查看/dev/logmpp 获得信息,解码失败,一致在报错,vdeu decoder unsupport stream format.

关于hi3516DV300的VDEC一些测试

视频可以通过VLC等工具正常播放,在查询一些资料后,有说海思无法解析只有一帧I帧的,于是查看输出视频,果然只有一帧I帧,其余是P帧。一个GOP其实就相当于一帧,一个IPB的组合,有些可以不要,I是参考帧,必须存在。现在重新提取视频,试图使输出存在多个I帧。设置GOP长度为30,既源视频每30帧作为一个GOP,输出I帧.

ffmpeg -i test.mp4 -s 800*600 -g 30 -x264opts bframes=0 out.h264

经上图操作,VDEC仍然输出错误。

通过ffprobe查看海思自带历程中的视频信息。

Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc

查看ffmpeg提取的视频信息

Stream #0:0: Video: h264 (High), yuv420p(progressive), 800x600, 29.97 fps, 29.97 tbr, 1200k tbn, 59.94 tbc

不考虑帧率和分辨率,在合适上有不同的地方yuvj420p和yuv420p,括号中有些参数也不同,先不关心具体参数含义,先保证参数相同,重新修改ffmpeg操作

ffmpeg -i test.mp4 -r 25 -pix_fmt yuvj420p -g 30  -x264opts bframes=0:colorprim=bt709:transfer=bt709:colormatrix=bt709   out.h264

经此操作之后,再次使用ffprobe查看,数据格式相同,再次用于VDEC,有意思的来了,还是没成功,和之前的效果一样。

通过ubuntu命令工具mediainfo 查看数据,好家伙还有不同的地方。关于hi3516DV300的VDEC一些测试关于hi3516DV300的VDEC一些测试

第一张是海思的,通过简单对比,发现参ref frame和profile不同,好,再次修改ffmpeg,经过修改之后,再次查看,发现基本相同了,除了ffmpeg提取的会有一些ecode settting这种,不确定是否会影响。

ffmpeg -i test.mp4 -r 25 -pix_fmt yuvj420p -g 15 -profile:v high -level:v 4.2  -x264opts ref=1:bframes=0:colorprim=bt709:transfer=bt709:colormatrix=bt709:b_pyramid=1   out.h264

将提取的视频再次用于测试,GG,还是不行,一样的错误,一样的现象,已经通过ffprobe和mediainfo两种工具比对,分析,保证两种视频基本是一致的参数了,VDEC仍然报错。

最后做一次测试,将海思自身VENC输出的数据流用于VDEC,完美,无任何错误。

问题来了,目前的操作中没有看出ffmpeg提取的视频有什么问题,但是就是无法播放,VENC出来的数据可直接播放。看到个说法,这款芯片只能自编自解,难道是真的?有点意思了,目前测试没有找到解决办法,264流仍然无法播放。

为了播放视频流,采取了一种折中的方式,将视频流输出为jpeg图片,VDEC不断刷图片,在达到一定帧率之后,人眼是无法辨识的,ffmpeg提取图片方式,提取出来的图片,如果有格式问题,和前面的操作类似。

ffmpeg -i test.mp4 frame%8d.jpeg

海思采坑记录。。。

相关标签: 海思