Pull to refresh

Comments 49

Круто, но это нужно иметь такой хороший опыт в дебаге прошивок, чтобы угадывать хеш-суммы по виду и смещения.
Особенно, момент когда оказалось, что хеш сумма идет после раздела фс.
Интересно, сколько времени потратил автор на эту работу.
просто не малый опыт реверса и низкоуровневого программирования. + немного психологии программирования.
суммарно убито чистыми около 10 часов.
А как камера себя поведет, если она вещает поток 2мбит/с, и подключено 2 клиента: у одного канал, предположим, 10мбит/с, а у другого — 1 мбит/с. Правильно ли я понимаю, что у 10мбит/с клиента будут невероятные лаги?
Как вообще правильно должна себя вести камера в таких случаях? Может знаете, как ведут себя в таком случае серверы-ретрансляторы?
При текущем решении — да, 10мбит будет лагать так же как и мегабитный клиент. По этой причине я бы не стал подцепляться к камере напрямик мобильным клиентом — только через сервера.
Правильно должна камера дропать на мегабитном потоке, и отдавать всё 10мегабитному.
Для этого надо держать для каждого клиента «aghtung» буфер размером в 1 кадр.
Все отправки — только неблокирующие.
Если ушло не всё — остаток копируется в ахтунг буфер, и при следующей отправке отправляется не кадр, а досылается ахтунг.
Если ахтунг пустой — отсылаем данные.

Только тут главное не запороть всё отправкой RTSP пакетов ортогонально, как в камере, о которой я писал в самом конце предыдущей статьи.

Правильные ретрансляторы ведут себя правильно :) erlyvideo себя правильно ведёт.
Я все же не понимаю, что именно она должна дропать. Расскажите, пожалуйста, чуть больше о процессе энкода. Камера использует H.264 Main Profile, или Baseline? Если Main, то использует ли B-фреймы? Если да, то как много.
В общем, мой вопрос такой: какие именно мы можем дропать кадры, чтобы картинка хотя бы не полностью развалилась?
Я, наверное, дурак. Никто ж не будет B-фреймы в камерах использовать.
Но, в любом случае, нам нельзя дропать I-фрейм. Так что камера должна знать тип кадра.
Можно дропать всё. Но лучше, конечно, ключевые кадры не дропать, если только в буфере не два кадра — но повторюсь, это повышенное усложнение…
О, если вопрос ставить _так_, то случай сложный.
Дело в том, что rtsp стример ортогонален энкодеру. И когда к стримеру приходит пакет, максимум что мы можем сделать — это дропнуть целиком _кадр_. Именно это позволит делать анализ таймстампа — все пакеты одного кадра выходят одновременно и с одним таймстампом.
Если в стример передавать море доп. информации, то всё сильно усложняет и вводит жесткую зависимость частей. Это неправильно.
нормальная история — сигнализировать энкодеру, что бы он вставил ещё keyframe или снизил битрейт
передать снизу вверх информацию о том, что не пролазит — да.
анализировать внизу что проходит и интеллектуально выкидывать — нет.
UFO just landed and posted this here
угу. каждый раз когда вижу его написаное, удивляюсь, и обещаю запомнить. и каждый раз пишу неправильно :)
Apple вот решил эту проблему в корне, брутально изобрев свой протокол стриминга.
Там поток режут на кусочки в банально складывают в папку. А клиент их банально
выкачивает по HTTP. В результате TCP соединения постоянно переоткрываются и ошибка
не накапливается.

Вот к чему приводит нежелание читать книжки папы Стивенса (W. Richard Stevens).
постоянно переоткрываемое соединение = регулярный лаг на открытие соединения = неравномерный стриминг…
протокол RTP over TCP совершенно корректен. а вот для корректной реализации алгоритма надо иногда знать чуток больше, чем названия функций.
Можно «немножко кешировать» пару секунд и пускать несколько TCP потоков на скачивание. Это даст лаг от realtime но видео будет гладкое и пушистое.

Кстати, VLC уже умеет делать стриминг в стиле Apple.

RTP хочет полосу. Изначальная заявка (в первой статье, насколько я помню) была именно борьба бобра с ослом, протиснуть поток там где он не пролезает.

Насчет квалификации программистов — согласен.
Да, хочет. Мы же говорим о реалтайм стриме? :)
Проблемы начинаются, когда он не пролазит, либо где-то застреёт.
Тут начинаются эффекты реализации.
это хорошо для броадкаста, где не страшна задержка в минуту или час, но не годится для риалтайм стриминга, где хочется уложиться в секунду-две.
Кусочки можно делать маленькие, по секунде. На кодеке H.264 1080p это примерно 4Mbit/s то есть порождается 500К файлик каждую секунду. Да, их надо хранить на диске хотя бы штук 20. Ну и что. Диски быстрые.
Получаем во-1х задержку на формирование кусочка.
Во-2х на время скачивания кусочка.
В-3их буферизация защитная в клиенте.
В-4ых задержки на подключение и возможные ретрансмиты.
Итого получается, что задержка будет от 5 секунд (что уже в реалтайме неприемлемо).
Но в целом, протокол имеет свою нишу.
HLS был придуман для несколько иной задачи, и от части с заделом на особенности применения на мобильных девайсах.
У меня наблюдаются похожие проблемы с Hikvision камерой. Но патчить прошивку не хватает квалификации.
Хе, это та самая камера, которая собрана на том же модуле, похоже?
Странно, мне репортили что с ней нет проблем. Вероятно, её при этом подцепляли по своему личному протоколу.

бегло глянул — прошивка архив похоже сразу с fs внутри, ни cram ни cpio ни tar оберток не нашел почему-то; но это не сильно критично.
судя по строкам типа
«Error! sendRtpPacket sendLen = %d»
rtp_tcp_sendstream close and pnet_connect = 0x%x
check_payload failed
rtp_tcp_sendstream close and pnet_connect=0x%x
wtitev rtp data error: %d
Timeout: Lost frame data retval = %d send_len %d errno = %d
rtpoverrtsp_sendstream: setsockopt:TCP_NODELAY ERROR:
rtpoverrtsp_sendstream: setsockopt:TCP_CORK ERROR:
<RTP_OVER_RTSP_Send()>frame_readidx=%d,rtpBufwriteIdx=%d,frameCnt=%d,overlaped_threshold=%d

похоже, что за значениями присматривают, вот только чутьё подсказывает, что они при проблемах закрывают со своей стороны.
в теории можно запатчить, на практике — попробуйте написать производителю камер о проблеме.
а есть возможность выставить её на немного в сеть? (урл и логпасс в личку плиз).
я потыкаю палочкой
Спасибо за доступ! Потыкал палочкой. Камера вполне корректно буферизует и поток _вроде_ не ломает.
Но какой-то шлак и мусор можно поймать после лага:
UNK NAL = 27
UNK NAL = 31
UNK NAL = 18
UNK NAL = 13
и камера бывает рвёт по своему желанию.
то есть такие какая-то некорректность у неё есть.
> патчем, защищающим TCP поток от порчи

«Патч, защищающий от порчи» — такое пол-Хабра с руками оторвет! ) Особенно, если не только по поводу TCP-потока
Предполагалось, что эта статья будет только в пятницу. Но так как сегодня ночью спать мне не удалось, зато появилось время её дописать.
чуть не забыл, еще почему нельзя объединять — это статьи о разном. та статья — теория, эта — практика. и они довольно параллельны ^_^
Сначала я хотел подумал что «вот нищеброд и бездельник, вместо того чтобы выкинуть китайскую камеру, ковыряет её», но когда прочитал подход и способ — проникся таким уважением к автору. Автор, ты просто молодец! Так держать!
P.S. Кстати не прочитал и половины, не разбираюсь я в этом однако автор все равно немерено крут ))
вот три внутренних камеры, которые на HiSilicon собраны (HI3516C 53H20L) скорее всего именно выкину. спишу в расход по 150$ за каждую, но сил моих уже нет — лагалище еще то. вот там совсем мрак и жуть внутри.
Так и не удалось их победить несмотря на ежемесячное обновление их прошивок китайцами?
У меня одна такая живёт и ещё 5 подобных ползут из Китая. Вроде как с родным видеорегистратором они ещё дружат, но там, похоже, используется какой-то свой протокол.
если хочешь, я могу три своих (объективы 4мм либо 2.8мм) сдать тебе за недорого :)

их DVR цепляет через свой протокол.
Но падение fps при совершенно непонятных условиях меня убивает.
Кроме просадки от числа коннектов, fps падает от освещённости.
Причем выключить эту лажу где — не представляю.
Они low lux походу интеграцией кадров получили.

Я выставил ограничение выдержки <40ms (то есть 25фпс на ура пролазит), всё равнок вечеру fps на обеих 8.33.
утром на ярком свету — снова 25fps.
Есть такая мысль, что ночью включается подсветка, лезут помехи из-за отсутствия фильтров по питанию, изображение покрывается какой-то рябью, а чип не справляется с возросшим потоком «мусора».
ну я смотрел — кондёры по питанию от подсветки стоят; плюс сама подсветка линейная — ИК диод и всё…
опять же, тогда бы и днём если закрыть фотодатчик fps же не падает…
не знаю что делать. еще поковыряю и сдамся.
Я такую американской сборки за 430 баков видел (хохо) что уж говорить про китайцев.
Вот её фамилия: IQinVision IQD32SV-F1, ближе к ночи после заката — 1 кадр в минуту.
в конце всех кручений, когда убрал DWDR, отрубил чего-то там еще, в общем, они стали себя вести лучше.
но всё равно, в моём случае она бесполезна — мне важнее видеть кто прошел и куда, чем какого цвета была шапка.
поэтому снял, все три лежат в коробках, на их место повесил на базе топсишных модулей.
Захотел узнать про команду strings, вбил в гугл «man strings». Зря.
Кажется, вы не тем интересуетесь. Мне гугл первым делом именно ман странциу от утилиты strings показывает.
Мне тоже, но ниже приложил картинки.
«Доктор, а откуда у вас такие картинки?» :)
А в каком месте rtsp_streamer можно увеличить TCP таймаут до 10 секунд? Автоматическим патчером из следующей статьи пропатчил, обрывы прекратились но картинка рассыпается.
а не знаю. в последних билдах найти место с таймаутом мне не удалось.
+ самые последние билды вообще надо заново расковыривать формат прошивки.
у меня TS38JK 2.5.1.0, сейчас еще раз протестировали со своей пропатченной и с прошивкой с datacompboy.ru/camfw/

ffmpeg -i rtsp://192.168.0.123/mpeg4 -vcodec copy test.avi
время от времени сыпет
[avi @ 0x138af00] H.264 bitstream error, startcode missing3 bitrate=3928.5kbits/s
Last message repeated 19 times

Но картинка без существенных артифактов.
проще уже самому прошивку написать.

Мы это и делаем.
они бутлоадер и формат паршивок попортили.
так что, возможно, теперь только over uart или вообще на программаторе паршивить
Sign up to leave a comment.

Articles