![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как замедлить прием данных с сервера HTTP [D7, WinXP]
DVM © (2006-04-06 11:42:00)Имеется 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 15:06:00) [1]
> Сергей М. © (06.04.06 14:11) [8]
Да, действительно, проанализировал трафик этих программ - стало ясно, что просто они пропускают кадры. Но принимают все.
Сергей М. (2006-04-06 14:11:00) [2]
> DVM © (06.04.06 14:00) [7]
Пойми, что соединение, использующее TCP-транспорт, подразумевает поточную трансмиссию данных .. Нельзя не выбрав из потока очередную порцию данных получить следующую за ней порцию !
DVM (2006-04-06 14:00:00) [3]
> Сергей М. © (06.04.06 13:53) [6]
Тем не менее есть пара-тройка программ, делающих то же, что и моя и они реализуют как то задержку между кадрами. И не похоже, что сделано это так, как я описал в [1]
Сергей М. (2006-04-06 13:53:00) [4]
> DVM © (06.04.06 12:37) [5]
Что тебе сервер передает, то и изволь получать ... Ни больше ни меньше ...
А уж как ты распорядишься принятым - то ли будешь прореживать "кадры", то ли не будешь - это твои проблемы... Но получить ты должен все что тебе передал сервер !
DVM (2006-04-06 12:37:00) [5]
> то трафик полюбой к те идти будет.
он будет идти, если я его запрашиваю, т.е. recv() вызываю.
MiHoY (2006-04-06 12:34:00) [6]а насчёт трафика: раз сервер установил с тобой соединение , то трафик полюбой к те идти будет.
DVM (2006-04-06 12:28:00) [7]
> а ты серваком отправляй медленней и всё
Я б с удовольствием, но сервер не мой и настройка fps у него хотя и есть, но не работает. С другими серверами, выдающими гарантированное число fps проблем нет, но нужно с этим.
MiHoY (2006-04-06 12:19:00) [8]а ты серваком отправляй медленней и всё
а клиентом принимай пакеты в дежурном режиме
DVM (2006-04-06 11:45:00) [9]Я конечно понимаю, что можно принимать все кадры (25 fps) и отбрасывать jpeg-и лишние, но это нагрузка совершенно лишняя и на сеть и на комп и трафик лишний.