Pjsip/Pjsua视频问题:帧缓冲区太小

Pjsip/Pjsua视频问题:帧缓冲区太小,sip,pjsip,pjsua2,openh264,Sip,Pjsip,Pjsua2,Openh264,我尝试在raspberry pi 3上使用Pjsip/Pjsua进行sip视频调用。 在编码之前,我使用主示例应用程序测试不同的选项。一切似乎都正常(注册、音频通话等),但当我尝试启动视频通话时,程序会停止,并显示以下消息: pjsua-armv7l-unknown-linux-gnueabihf:../src/pjmedia videodev/v4l2_dev.c:737:vid4lin_stream_get_frame_mmap:Assertion`!“帧缓冲区对于v4l2太小”失败 我搜索

我尝试在raspberry pi 3上使用Pjsip/Pjsua进行sip视频调用。 在编码之前,我使用主示例应用程序测试不同的选项。一切似乎都正常(注册、音频通话等),但当我尝试启动视频通话时,程序会停止,并显示以下消息:

pjsua-armv7l-unknown-linux-gnueabihf:../src/pjmedia videodev/v4l2_dev.c:737:vid4lin_stream_get_frame_mmap:Assertion`!“帧缓冲区对于v4l2太小”失败

我搜索了很多,包括源代码:

/* get frame from mmap */
static pj_status_t vid4lin_stream_get_frame_mmap(vid4lin_stream *stream, pjmedia_frame *frame)
{
struct v4l2_buffer buf;
pj_time_val time;
pj_status_t status = PJ_SUCCESS;

pj_bzero(&buf, sizeof(buf));
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
status = xioctl(stream->fd, VIDIOC_DQBUF, &buf);
if (status != PJ_SUCCESS)
return status;

if (frame->size < buf.bytesused) {
/* supplied buffer is too small */
pj_assert(!"frame buffer is too small for v4l2");
status = PJ_ETOOSMALL;
goto on_return;
}
/*从mmap获取帧*/
静态pj_状态_t vid4lin_流_get_帧_mmap(vid4lin_流*流,pjmedia_帧*帧)
{
结构v4l2_缓冲区buf;
pj_时间_val时间;
pj_状态=pj_成功;
pj_bzero(&buf,sizeof(buf));
buf.type=V4L2\u buf\u type\u视频捕获;
buf.memory=V4L2\u memory\u MMAP;
状态=xioctl(流->fd、VIDIOC_DQBUF和buf);
如果(状态!=PJ_成功)
返回状态;
if(帧->大小
所以我知道pjmedia_帧的“大小”不如v4l2缓冲区,这导致了我的失败。 我的问题很简单:如何更改此设置? 我在示例应用程序中尝试了一切:更改分辨率、比特率、fps,。。 我发现一些资源说要更改h264配置文件级别。好的,但是我应该在哪里设置它?它是在v4l2管理器中设置的?还是直接在应用程序中设置的?我该如何设置? 我在v4l2中使用了不同的选项来降低比特率/分辨率,以获得一个小的缓冲区,但仍然得到相同的错误

在这一点上,我完全不知所措

为了提供信息,我按照PJsip的建议使用openh264(没有libx264)编译了PJsip


感谢您的帮助/想法;)

根据您关于配置文件级别的问题,您可以尝试:

const pj_str_t codec_id = {"H264", 4};
pjmedia_vid_codec_param param;
pj_status_t status;

status = pjsua_vid_codec_get_param(&codec_id, &param);
param.dec_fmtp.param[0].name = pj_str("profile-level-id");
param.dec_fmtp.param[0].val = pj_str("42e01f");
status = pjsua_vid_codec_set_param(&codec_id, &param);
pjsua_start()
之后的任意位置执行此操作。
val
属性中的最后两个字符是配置文件级别。级别说明可在此处找到()。有关h264配置文件的更多信息,请在此处找到()

我不是v4l2的专家,但对在rpi3上编码视频几乎没有经验,我建议您使用FFmpeg而不是纯openh264,因为它支持硬件加速()

祝你好运