我正在使用 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;
}