Я реализую Видеозвонок с использованием библиотеки 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;
}