我试着在我的树莓派3上使用Pjsip/Pjsua进行sip视频通话。在编码之前,我使用主示例应用程序来测试不同的选项。一切似乎都正常(注册、音频通话等(,但当我尝试启动视频通话时,程序会停止,并显示以下消息:
pjsua-armv7l-unknown-linux-gnueabihf:/src/pjmedia videodev/v4l2_dev.c:737:vid4lin_stream_get_frame_mmap:断言`!"帧缓冲区对于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;
}
所以我知道pjmedia_frame的"大小"低于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, ¶m);
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, ¶m);
在pjsua_start()
之后的任何位置执行此操作。val
属性中的最后两个字符是配置文件级别。可以在此处找到级别描述(链接(。有关h264配置文件的更多信息,请点击此处(链接(。
我不是v4l2的专家,但对rpi3上的视频编码经验很少,我建议您使用FFmpeg而不是纯openh264,因为支持硬件加速(链接(。
祝你好运!