Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизКак замедлить прием данных с сервера HTTP Найти похожие ветки
← →
DVM © (2006-04-06 11:42) [0]Имеется HTTP сервер, вещающий видео в формате MotionJPEG. Для тех кто не знает это данные в виде:
--разделитель
данные jpeg
--разделитель
данные jpeg
и т.д.
Работаю через сокеты Winsock и получаю данные, выделяю jpeg -и без проблем.
Но вот есть необходимость, выводить кадры реже, скажем, 2 раза в секунду. Первое решение которое приходит в голову - это после приема и выделения очередного целого jpeg-а сделать в потоке, получающем данные Sleep(500).
Это, конечно помогает, частота кадров становится 2 fps.
НО ЕСТЬ ОДНО НО!
HTTP сервер выдает данные порциями и совсем необязательно, что в одну порцию влезает jpeg целиком или jpeg влезает ровно в несколько порций. Т.е. в полученных данных после выделения очередного кадра остается хвост - начало следующего, еще непринятого jpeg-a. Осташуюся часть jpeg -а HTTP-сервер хранит и выдает мне со следующей порцией данных. А мой Sleep как раз и встревает в середине JPEG-а.
Начинаются значительные тормоза в приеме. Изображение сильно отстает от реального. FPS верный, какой и задан Sleep, но отставание достигает 5-10 секунд.
Как сделать задержку между кадрами правильно?
← →
DVM © (2006-04-06 11:45) [1]Я конечно понимаю, что можно принимать все кадры (25 fps) и отбрасывать jpeg-и лишние, но это нагрузка совершенно лишняя и на сеть и на комп и трафик лишний.
← →
MiHoY (2006-04-06 12:19) [2]а ты серваком отправляй медленней и всё
а клиентом принимай пакеты в дежурном режиме
← →
DVM © (2006-04-06 12:28) [3]
> а ты серваком отправляй медленней и всё
Я б с удовольствием, но сервер не мой и настройка fps у него хотя и есть, но не работает. С другими серверами, выдающими гарантированное число fps проблем нет, но нужно с этим.
← →
MiHoY (2006-04-06 12:34) [4]а насчёт трафика: раз сервер установил с тобой соединение , то трафик полюбой к те идти будет.
← →
DVM © (2006-04-06 12:37) [5]
> то трафик полюбой к те идти будет.
он будет идти, если я его запрашиваю, т.е. recv() вызываю.
← →
Сергей М. © (2006-04-06 13:53) [6]
> DVM © (06.04.06 12:37) [5]
Что тебе сервер передает, то и изволь получать ... Ни больше ни меньше ...
А уж как ты распорядишься принятым - то ли будешь прореживать "кадры", то ли не будешь - это твои проблемы... Но получить ты должен все что тебе передал сервер !
← →
DVM © (2006-04-06 14:00) [7]
> Сергей М. © (06.04.06 13:53) [6]
Тем не менее есть пара-тройка программ, делающих то же, что и моя и они реализуют как то задержку между кадрами. И не похоже, что сделано это так, как я описал в [1]
← →
Сергей М. © (2006-04-06 14:11) [8]
> DVM © (06.04.06 14:00) [7]
Пойми, что соединение, использующее TCP-транспорт, подразумевает поточную трансмиссию данных .. Нельзя не выбрав из потока очередную порцию данных получить следующую за ней порцию !
← →
DVM © (2006-04-06 15:06) [9]
> Сергей М. © (06.04.06 14:11) [8]
Да, действительно, проанализировал трафик этих программ - стало ясно, что просто они пропускают кадры. Но принимают все.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.065 c