关于hi3516DV300的VDEC一些测试

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.

视频可以通过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 查看数据,好家伙还有不同的地方。

第一张是海思的,通过简单对比,发现参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

海思采坑记录。。。

最后记录一点,3516DV300确实只支持自编自解。真的有意思了。。。。

猜你喜欢

转载自blog.csdn.net/huahuang1508/article/details/106924354