0

我正在使用 Pjsip 库版本 2.10 和 H264 编解码器(OpenH264 版本 2.1.0)实现视频通话

我遇到了视频通话问题,在视频流实际开始之前它总是显示绿屏。我想将绿色框架更改为黑色

我尝试通过在构建 Pjsip 之前对文件 (pjmedia/src/pjmedia/vid_port.c) 进行一些修改来应用在搜索过程中出现的一些建议解决方案,但它不适用于我,没有发生了变化,绿框仍然出现。

所以请任何人帮助我解决这个问题,在此先感谢您!


编辑:我尝试过的一些不同的解决方案


1-以下代码根据Pjsip链接http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/2016-August/019417.html

if (need_frame_buf) {
    .....
    vp->frm_buf->type = PJMEDIA_FRAME_TYPE_NONE;
    /* Insert the below code after you find the above line ---- */
    /* Note: this will only work for I420 format */
    if (vparam.fmt.id == PJMEDIA_FORMAT_I420) {
        pj_memset(vp->frm_buf->buf, 0x80, vp->frm_buf_size);
        pj_bzero(vp->frm_buf->buf,
            vparam.fmt.det.vid.size.w*vparam.fmt.det.vid.size.h);
    }
    /* ---- */



2-更改以下代码:

/* pjmedia_vid_port_start(vp); */
pjmedia_vid_dev_stream_start(vp->strm);

至:

pjmedia_vid_port_start(vp);
/* pjmedia_vid_dev_stream_start(vp->strm); */


要达到功能 pjmedia_vid_port_start():

PJ_DEF(pj_status_t) pjmedia_vid_port_start(pjmedia_vid_port *vp)
{
    pj_status_t status;

    PJ_ASSERT_RETURN(vp, PJ_EINVAL);

    status = pjmedia_vid_dev_stream_start(vp->strm);
    if (status != PJ_SUCCESS)
    goto on_error;

    /* Initialize buffer with black color */
    {
        const pjmedia_video_format_info *vfi;
        const pjmedia_format *fmt;
    pjmedia_video_apply_fmt_param vafp;
    pjmedia_frame frame;

    pj_bzero(&frame, sizeof(pjmedia_frame));
    frame.buf = vp->frm_buf->buf;
    frame.size = vp->frm_buf_size;

    fmt = &vp->conv.conv_param.src;
    status = get_vfi(fmt, &vfi, &vafp);
    if (status == PJ_SUCCESS && frame.buf) {
        frame.type = PJMEDIA_FRAME_TYPE_VIDEO;
        pj_assert(frame.size >= vafp.framebytes);
        frame.size = vafp.framebytes;

        if (vfi->color_model == PJMEDIA_COLOR_MODEL_RGB) {
            pj_memset(frame.buf, 0, vafp.framebytes);
        } else if (fmt->id == PJMEDIA_FORMAT_I420 ||
               fmt->id == PJMEDIA_FORMAT_YV12)
        {           
            pj_memset(frame.buf, 16, vafp.plane_bytes[0]);
            pj_memset((pj_uint8_t*)frame.buf + vafp.plane_bytes[0],
                  0x80, vafp.plane_bytes[1] * 2);
        }
        }
    }

    if (vp->clock) {
    status = pjmedia_clock_start(vp->clock);
    if (status != PJ_SUCCESS)
        goto on_error;
    }

    return PJ_SUCCESS;

on_error:
    pjmedia_vid_port_stop(vp);
    return status;
}
4

0 回答 0