Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Как замедлить прием данных с сервера 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.03 c
1-1153160195
Pashka.cool
2006-07-17 22:16
2006.08.27
Как из одного приложения определять контролы другого, на клик мыш


9-1133797183
Профан Профаныч
2005-12-05 18:39
2006.08.27
Загрузка md2 моделй.


2-1155025500
Ega23
2006-08-08 12:25
2006.08.27
FindComponent и UpperCase


1-1153049189
NeWT
2006-07-16 15:26
2006.08.27
Console application в фоне


15-1154000038
Иксик
2006-07-27 15:33
2006.08.27
Поздравьте меня!