0

我尝试在我的树莓派 3 上使用 Pjsip/Pjsua 进行 sip 视频通话。在编码之前,我使用主示例应用程序来测试不同的选项。一切似乎都正常(注册,音频通话,..)但是当我尝试开始视频通话时,程序停止并显示以下消息:

pjsua-armv7l-unknown-linux-gnueabihf: ../src/pjmedia-videodev/v4l2_dev.c:737: vid4lin_stream_get_frame_mmap: Assertion `!"frame buffer is too small for v4l2"' failed.

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

/* 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 缓冲区,导致我失败。我的问题很简单:如何更改此设置?我在示例应用程序中尝试了 evetything:更改分辨率、比特率、fps,.. 我发现一些资源说要更改h264 配置文件级别.. 好的,但是我在哪里设置呢?它在 v4l2 管理器中吗?或直接在应用程序中?我该怎么做 ?我在 v4l2 中使用了不同的选项来降低比特率/分辨率,以便有一个小的缓冲区,但仍然得到相同的错误。

在这一点上,我完全无能为力。

有关信息,我按照 PjSip 的建议使用 openh264(无 libx264)编译了 PJsip。

感谢您的帮助/想法;)

4

1 回答 1

0

根据您关于个人资料级别的问题,您可以尝试:

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,因为支持硬件加速(链接)。

祝你好运!

于 2020-03-20T11:16:30.760 回答