LINUX.ORG.RU

Почему такая скорость передачи RTP?

 , ,


0

1

Приветствую.

Для реализации WebRTC сервера, переделал в своем коде на базе libav/ffmpeg/ffserver «передачу» кадров между камерой и своим RTSP сервером вместо lo интерфейса на кольцевой буфер заранее заданной длины, поскольку это место перестало быть узким - наблюдаю такую картину - RTP/UDP пакеты RTSP сервером при старте в один поток в течении нескольких секунд отдаются с такой задержкой, что с камеры (15fps) успевает прийти несколько десятков кадров (пока проверял на rtsp камере, но думаю и на usb будет тоже самое), все это длится первых секунд может 5-10 трансляции, при «большой» длине кольца камера (голова) не успевает догнать сервер (хвост), но со временем сервер начинает догонять голову и уже после этого как и хотелось работает все последовательно, задержка становится минимально возможной.

RTSP/RTP сервер однопоточный, его тормоза на 10 потоках (когда камера гарантированно последовательно догоняет позицию буфера передаваемую ртсп-клиентам) логически возможно понятны, но почему такое плавание скорости происходит???

Передача через 1 коммутатор с одноплатника выполняется, камера подцеплена к нему «локально» через вторую сетевку.

★★★★

Бедняга, ты всё ещё его пишешь?

Тебе надо начать с того, что принять с камеры пакеты и аккуратно в CSV сложить микросекунду прибытия пакета и его таймкод.

Задержка с обычной камеры наблюдения настолько стабильна, что легко можно посинкать губы с разных камер (но одинаковых). Кейфреймы сильно жирнее обычных, может быть в 1000 раз разница.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Когда время есть пишу, надо будет вот srtp пакеты делать из avpacket, соединение с браузером есть, dtls согласование прошло.

Дело не в камерах и кфреймах, не пойму почему av_write_frame в сеть может сначала сильно тормозить, а потом вдруг ускоряться на интервалах много больше размера gop, хотя это не точно, завтра сделаю замеры.

В целом вопрос даже не понимаю куда смотреть, так то работает, просто задержка гуляет, а на 10 потоках вижу как ничего не сыпется но видео начинает просто замедляться.

Просто вы кажется говорили что рстп/ртп сервер однопоточный разумный выбор, но похоже для вебртс буду делать отдельный поток на каждый стрим

wolverin ★★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)

РКН на пути есть? Они UDP трафик поганят, тот же QUIC просто режут (хотя я даю гарантии что QUIC вытеснит всё остальное со временем вне чебурнета, где его режут даже в пределах одного города), а то что ты видишь похоже на задержки ТСПУ (он сейчас в разрыв стоит, а не в параллель как когда-то давным-давно) когда он пытается понять что через него идёт. А как поймёт, то резать прекращает или совсем режет.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 5)
Ответ на: комментарий от peregrine

Передача через 1 коммутатор с одноплатника выполняется, камера подцеплена к нему «локально» через вторую сетевку.

Сильно сомневаюсь.

vel ★★★★★
()
Ответ на: комментарий от vel

Невнимательно прочитал. Тогда что-то с буферизацией. Либо на самой камере, либо, что более вероятно в коде (читать тоже можно по-разному и буферы есть даже у ОС и библиотек). Некоторые вполне могут быть, даже от того, как он этот лаг определяет. Если практикой, то сам ffplay может быть виновником, если всё-же в коде, то и с Pacing проблемы могут быть и опять с «ffserver» / libavformat у которых свой буфер и с планировщиком ОС.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

буферы да… наблюдаю какой прикол - останавливаю чтение с камеры av_read_frame, но соединение не разрываю, делаю какие нибудь движения на камеру, начинаю снова читать гарантированно с нового места в своем кольце - наблюдаю 1-2 секунды видео которое я даже «не читал» )))

wolverin ★★★★
() автор топика
Ответ на: комментарий от wolverin

Ну так разберись с буферами. Без кода больше ничего сказать не выйдет. Можешь конечно gemeni помучать своим вопросом. Но для деталей код нужен уже. Чтоб смотреть что ты не так делаешь.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

иногда мне нужно написать вопрос, чтобы понять что спрашивать ))

итак по сути к коду - нашел первое «тугое» место, вызов ffurl_write пакетами не более 1216 байт (нужно в vpn влазить без дополнительной фрагментации) обычно занимает 0.03 мс (иногда может 1.3мс), НО бывает что проваливается аж до 50мс, с учетом того что вызов этих дофега, то «кадры» писаться могут и 200мс, при этом кадры ЦЕЛИКОМ с камеры поступают НЕ РЕЖЕ чем через 50-60мс

wolverin ★★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

не ничего не меняется, вот к примеру ОДИН кфрейм отправляется (время вызова в мс / размер в байтах)

SEND UDP 41.282 / 1216
SEND UDP 0.042 / 1216
SEND UDP 0.040 / 1216
SEND UDP 0.031 / 1216
SEND UDP 0.032 / 1216
SEND UDP 0.023 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.031 / 1216
SEND UDP 0.028 / 1216
SEND UDP 0.029 / 1216
SEND UDP 0.028 / 1216
SEND UDP 0.027 / 1216
SEND UDP 0.031 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.024 / 1216
SEND UDP 0.038 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.026 / 1216
SEND UDP 0.026 / 1216
SEND UDP 0.026 / 1216
SEND UDP 0.027 / 1216
SEND UDP 43.748 / 1216
SEND UDP 0.024 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.029 / 1216
SEND UDP 0.030 / 1216
SEND UDP 0.027 / 1216
SEND UDP 0.028 / 1216
SEND UDP 0.028 / 1216
SEND UDP 0.029 / 1216
SEND UDP 0.028 / 1216
SEND UDP 0.026 / 1216
SEND UDP 0.026 / 802
wolverin ★★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

да нет, все правильно rtp://х.х.х.х:52192?pkt_size=1216&buffer_size=524288 задается буфер сокета судя по документации и libavformat/udp.c

wolverin ★★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

решил посмотреть а что же у меня происходит с av_read_frame - так вот если почитать, потом остановиться, подождать любое время и снова начать читать, то ВСЕГДА мне прилетает в начале со скоростью вызова ~0.5мс несколько десятков кадров общим объемом ~1.8Мб, таких буферов я нигде не задаю и в ядре нет.

после прилета этого мусора, чтение дальше происходит штатно со скоростью ~50мс

wolverin ★★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 3)
Ответ на: комментарий от wolverin

решило проблему перед началом воспроизведения после паузы av_seek_frame(pFmtCtxInp, 0, INT64_MAX, AVSEEK_FLAG_ANY), ругань libav только в начале чтения каждый раз )

wolverin ★★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария