Pjsip / Pjsua видео проблема: слишком маленький кадровый буфер - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь сделать sip-видеовызов с помощью Pjsip / Pjsua на моем Raspberry Pi 3. Перед написанием кода я использую основной пример приложения для тестирования различных вариантов. Кажется, все работает (регистрация, аудиовызов, ..), но когда я пытаюсь начать видеовызов, программы останавливаются со следующим сообщением:

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.

Спасибо за вашу помощь / идеи;)

1 Ответ

0 голосов
/ 20 марта 2020

В соответствии с вашим вопросом об уровне профиля, вы можете попробовать:

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, из-за поддержки аппаратного ускорения ( ссылка ).

Удачи!

...