|  | 
 
| 本帖最后由 luxiaofei 于 2019-12-29 14:29 编辑 
 是这样的,我用mpp编码opencv的mat
 初始化的关键代码:
 
 调用mpp的代码:(其中image2是mat格式的)    mpp_enc_data.fmt = MPP_FMT_YUV420P;
    if (mpp_enc_data.fmt <= MPP_FMT_YUV420SP_VU)
        mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride * 3 / 2;
    else if (mpp_enc_data.fmt <= MPP_FMT_YUV422_UYVY) {
        // NOTE: yuyv and uyvy need to double stride
        mpp_enc_data.hor_stride *= 2;
        mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride;
    } else
        mpp_enc_data.frame_size = mpp_enc_data.hor_stride * mpp_enc_data.ver_stride * 4;
 
 相当于先把opencv的mat转成yuv格式的,再编码,是可以的。        unsigned char *buf = mpp_buffer_get_ptr(mpp_enc_data.frm_buf);
        cvtColor(image2, dstimage,CV_RGB2YUV_I420);
        memcpy(buf, dstimage.data,Image_Width*Image_High*3/2*sizeof(unsigned char));
        ret = mpp_frame_init(&frame);
        mpp_frame_set_width(frame, mpp_enc_data.width);
        mpp_frame_set_height(frame, mpp_enc_data.height);
        mpp_frame_set_hor_stride(frame, mpp_enc_data.hor_stride);
        mpp_frame_set_ver_stride(frame, mpp_enc_data.ver_stride);
        mpp_frame_set_fmt(frame, mpp_enc_data.fmt);
        mpp_frame_set_buffer(frame, mpp_enc_data.frm_buf);
        ret = mpp_enc_data.mpi->encode_put_frame(mpp_enc_data.ctx, frame);
        ret = mpp_enc_data.mpi->encode_get_packet(mpp_enc_data.ctx, &packet);
 但是在初始化时,我把流格式设置为MPP_FMT_RGB888,不使用cvtcolor函数,直接拷贝内存,
 
 编码出来的就是花屏,        //cvtColor(image2, dstimage,CV_RGB2YUV_I420);
        memcpy(buf, image2.data,Image_Width*Image_High*4*sizeof(unsigned char));
问一下版主和大家有没有什么经验
 
 
 
 | 
 |