Android Pjsip: Как изменить цвет зеленой рамки при инициализации видеозвонка - PullRequest
0 голосов
/ 18 июня 2020

Я реализую Видеозвонок с использованием библиотеки Pjsip версии 2.10 с кодом H264 c (OpenH264 версии 2.1.0)

У меня возникла проблема с видеозвонок, где всегда отображается зеленый экран перед фактическим запуском потоковой передачи видео. Я хочу изменить зеленые рамки на черные .

Я попытался применить некоторые предлагаемые решения, которые появлялись у меня в процессе поиска, внеся некоторые изменения в файл (pjmedia / src / pjmedia / vid_port. c) перед сборкой Pjsip, но у меня он не работает, никаких изменений не произошло, зеленые рамки все еще появляются.

Так что, пожалуйста, может кто-нибудь помочь мне с этим, заранее спасибо!


Изменить: некоторые из различных решений, которые я пробовал

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;
}
...