海思播放器解码记录

  在设备端采用minigui+hisi vdec+vo实现本地视频回放,这个方案是在两年前就实现了的。但是最近在对接ipc后,使用播放器播放录像发现以下两个问题:

    1)在ipc使用高码流(4MB/s)录像时,视频回放只能回放几秒数据就无法解码

    2)设置ipc帧率是25f/s时回放效果是慢放,以前一直使用8f/s测试

对于问题1,解决方案是解码器初始化时给的内存大小不足导致的(红色部分参数)。

typedef struct hiVDEC_CHN_ATTR_S
{
PAYLOAD_TYPE_E enType;
HI_U32 u32BufSize ; /*stream buf size(Byte)*/
HI_U32 u32Priority ; /*priority*/
HI_U32 u32PicWidth ; /*max pic width*/
HI_U32 u32PicHeight ; /*max pic height*/
union
{
VDEC_ATTR_JPEG_S stVdecJpegAttr;
VDEC_ATTR_VIDEO_S stVdecVideoAttr;
};
}VDEC_CHN_ATTR_S;
【成员】
成员名称 描述
enType 解码协议类型枚举值。
     静态属性。
u32BufSize 码流缓存的大小。
     取值范围:大于等于解码通道大小(宽 x 高)的 3/4 倍,即 420
     象大小的一半(宽 x x3/2x1/2),以 byte 为单位。
     推荐值:一幅 YUV420 解码图像大小。即:宽 x x1.5
     静态属性。
u32Priority 通道优先级,取值范围为 1 ~ 255,值越大优先级越高。
     注意: 0 表明此通道不被调度,
                 Hi3521/Hi3520A/Hi3520D/Hi3515A/Hi3515C VEDU 优先级无效
     但必须设置为非 0 才能解码
u32PicWidth 通道支持的解码图像最大宽(以像素为单位)
     静态属性。
u32PicHeight 通道支持的解码图像最大高(以像素为单位)
     静态属性。
stVdecJpegAttr JPEG 通道的相关属性
stVdecVideoAttr JPEG 以外其它所支持类型的通道的相关属性


typedef struct hiVDEC_PRTCL_PARAM_S
{
HI_S32 s32MaxSliceNum;
HI_S32 s32MaxSpsNum;
HI_S32 s32MaxPpsNum;
HI_S32 s32SCDBufSize;
HI_S32 s32DisplayFrameNum;
}VDEC_PRTCL_PARAM_S;
【成员】
成员名称 描述
s32MaxSliceNum 该通道解码支持的最大 Slice 个数, ,默认为 16,仅对
                                  H.264 有效,取值范围为[1, 136]
s32MaxSpsNum 该通道解码支持的最大 SPS 个数,默认为 2,仅对 H.264
         有效,取值范围为[1, 32]
s32MaxPpsNum 该通道解码支持的最大 PPS 个数,默认为 2,仅对 H.264
         有效,取值范围为[1, 256]
s32SCDBufSize 码流切分模块的 buffer 大小,对 JPEG/MJPEG 无效, h
                            264 解码时,取值为大于等于 MAX 256 x 1024,通道
        宽 x 通道高 x 3 / 2);其它协议解码时取值为大于等于
        解码通道大小(宽 x 高)。
s32DisplayFrameNum 显示及解码缓存的图像的最小帧数,对 H.264 解码通道
           默认为 2,对 JPEG 解码通道默认为 4
           取值范围: [1, 16]


2)对于问题二

    是对解码器工作模式的理解错误,以前是8f/s的数据,所以每向解码器发送一帧数据我都会睡一小会,再发送下一帧数据。通过usleep达到控制帧率的效果。其实这种理解是错误的。对解码器而言,它没有帧率的概念,读取h264数据只需要查询解码器状态,能继续发送数据给它就直接发送就行,让解码器全速运行解码即可。而帧率控制是通过vdec绑定vo之后,设置vo的帧率参数来达到视频播放帧率控制效果。

HI_MPI_VO_SetChnFrameRate
【描述】
设置指定视频输出通道的显示帧率。
【语法】
HI_S32 HI_MPI_VO_SetChnFrameRate (VO_DEV VoDev,VO_CHN VoChn, HI_S32
s32VoFramerate);
【参数】
参数名称 描述 输入/输出
VoDev 视频输出设备号。 输入
VoChn 视频输出通道的通道号。
取值范围: [0, VO_MAX_CHN_NUM)
输入
s32VoFramerate 视频通道显示帧率。 输入
【返回值】
返回值 描述
0 成功。
0 失败,其值为错误码。

你可能感兴趣的:(视频,Linux,c)