Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2015, 20:04   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Какие есть способы передачи потокового видео на сервер из delphi 7

Мне нужно периодическое отображение на сайте реалтаймовое ( хотя бы приблизительное, допустим с некоторой задержкой около 5 секунд допустим, но чем меньше тем лучше) области другой программы.
Сейчас могу сделать с помощью периодичекой, порядка 1 кадра в 1-3 секунды скриншота на сервер, а браузер с периодичностью в 2 раза чаще опрашивает сервер на новый рисунок и таким образом получается некое подобие очень медленного видео.
Так вот, есть ли какие либо способы реализовать это настоящее видео?
Хотя бы низкого качетва.

Но имеется ряд ограничений:
1) можно ли будет контролировать качество и пропорционально нагрузку на ПК с которого будет видео это посылаться.
2)сервер VPS от DigitalOceane 1 ядро процессора 512 Оперативы Ubuntu, там стоит Vesta CP с php 5.3 MySql, nginx
Справится ли он, при том ,что хотелось бы, параллельная работа нескольких таких потоков с разных компов.

3) И собственно самое главное, так как я очень поверхностно знаю delphi 7, и недавно начал знакомиться с не виндоус VPS, насколько это может оказаться сложным?

Последний раз редактировалось Illusiony; 28.08.2015 в 21:05.
Illusiony вне форума Ответить с цитированием
Старый 28.08.2015, 22:40   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Если необязательно делать из Delphi 7, можно разобраться с командной строкой ffmpeg и вещать им, по RTMP и в каком-нибудь общепринятом формате, вроде FLV или MP4.

Вот у меня такой Screencast.bat, пригодный для вещания на Livecoding.tv из-под XP:
Код:
@start "Livecoding.tv" /min ffmpeg -f gdigrab -framerate 6 -offset_y 44 -video_size "1280x960" -i desktop -i 
X:\Projects\CantorSys\trunk\Logo\LogoTV.png -filter_complex "overlay=W-w-8:y=8:format=yuv444'" -f dshow -i 
audio="Virtual Cable 1" -framerate 25 -f flv -acodec libmp3lame -ab 112k -joint_stereo 0 -ac 2 -af "volume=2"
 -vcodec libx264 -pix_fmt yuv422p -keyint_min 5 -vb 1000k -bufsize 5000k -preset ultrafast %*

Последний раз редактировалось Stilet; 29.08.2015 в 09:00.
Vapaamies вне форума Ответить с цитированием
Старый 29.08.2015, 01:23   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Именно на delphi 7, так как мне еще нужно манипулировать действиями в чужой программе от сигналов с браузера, а кроме delphi7 ничего не знаю из клиентских языков программирования.
Illusiony вне форума Ответить с цитированием
Старый 10.09.2015, 20:37   #4
ima7
 
Регистрация: 09.09.2015
Сообщений: 2
По умолчанию

спасибо, мне тоже очень помогли
ima7 вне форума Ответить с цитированием
Старый 19.09.2015, 17:49   #5
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Делаю для теста просто загрузку скриншотов на сервер и отображение их в браузере.
Из программы делаю скриншоты каждые 2 секунды и отправляю их на сервер. На сервере php ложит их на RAM диск.
Открываю страничку и с частотой 1 раз в секунду перезагружаю скриншот с сервера.
Так вот, довольно часто происходит ошибка при загрузке скриншота, т.е он не загружается типо нету такого файла.
Файл загружается через подстановку рандомного числа к пути до 100000 так как на сервере через nginx кэшируются файлы этого типа для браузеров. Правильнее нужно бы как нибудь запретить кеширование определенных конкретных файлов самим nginx.

Неужели во время загрузки очередного скриншота сервером рисунок на некоторое время блокируется для загрузки( чтения) и в эти моменты браузер не может его загрузить?

Последний раз редактировалось Illusiony; 19.09.2015 в 18:08.
Illusiony вне форума Ответить с цитированием
Старый 26.09.2015, 14:44   #6
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Может кто еще знает способы выхода из ситуации?
Такой вариант наверно бессмысленный?:
- делаем скриншот запоминаем его, отсылаем на сервер
- следующий скриншот ( скриншоты) оцениваем пиксели которые изменились
- передаем в сжатом виде информацию на сервер о изменившихся пикселей

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


Но этот способ создаст огромную нагрузку на комп от delphi программы а также на браузер при отображении и изменении холста. И, скорее всего выигрыша в трафике в таком случае не будет(((.

Как же сделать приемлемый вариант?
Illusiony вне форума Ответить с цитированием
Старый 26.09.2015, 15:00   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но этот способ создаст огромную нагрузку на комп
Почему? Разве кодеки не так делают? Тем паче что (поправьте меня) такие функции как BitBlt() так же умеют формировать маску по двум изображениям, оставляя только измененные пиксели, а дальше в дело можно пустить LZMA алгоритм для сжатия.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 15:38   #8
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Да но при простом попиксельном сравнение :
При частоте скриншотов 1 раз в секунду или быстрее
1) нужно пройтись по всем пикселем изображания и найти разность ( думаю при такой скорости это будет влиять на загрузку компа сильно)
2) разностных пикселей может оказаться очень много несмотря на то что они может быть изменились незначительно или допустим все цвета пикселей сдвинулись куда то на 1 пиксель. Тогда разность будет= всему изображению, хотя визуально человек этого и не заметит.

Короче здесь, наверное уже задачи порядком повыше моих знаний и сложности задачи. В общем это задачи алгоритмов потокового видео ( что я неосилю, да и это не стоит свеч)

Я просто хочу найти простой способ для:
1) более плавного отображения скриншотов( видео)
2) по возможности уменьшить трафик ( по сравнению с простой пересылкой скриншотов jpg)
3)при всем этом чтобы задержка скриншотов( видео) была наименьшей

Пока что механизм такой:
- программа на делфи с частой 1 раз в секунду посылает на сервер скриншоты размером примерно 100-150 кбайт в jpg
- с такой же частотой сервер подгружает этот скриншот( покачто постоянно перезагружает картинку без проверки ее обновления, исправлю это путем посылки запросов с удвоенной частотой и только если изменился, то перезагружать)
-при совершении команды с браузера информация передается на сервер ->программа на делфи при отправке скриншота проверяет пришли ли новые команды, если пришли то исполняет их.
-таким образом суммарная задержка между действием в браузере и загрузкой скриншота уже после совершения действия ( чтобы уже увидеть результат) достигает около 5 секунд

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


Сейчас пытаюсь найти такую функцию(свойство) у BitBlt(), что Вы описали, пока без результатно.
там куча параметров:
Rop: Одна из констант теpнаpных pастpовых опеpаций: Blackness, DSTInvert, MergeCopy, MergePaint, NotSrcCopy, NotSrcErase, PatCopy, PatInvert, PatPaint, SrcAnd, SrcCopy, SrcErase, SrcInvert, SrcPaint, Whiteness. SrcCopy

Последний раз редактировалось Illusiony; 26.09.2015 в 16:13.
Illusiony вне форума Ответить с цитированием
Старый 26.09.2015, 17:32   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
SrcErase, SrcInvert
Вот вот вот... Теперь нужно почитать внимательно для чего и как они применяются.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 18:18   #10
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

SRCERASE Комбинирует инвертированные цвета целевого прямоугольника с цветами исходного прямоугольника при помощи использования булева оператора И (AND).
SRCINVERT Комбинирует цвета источникового и целевого прямоугольников при помощи использования булева оператора исключающее ИЛИ (XOR).
NOTSRCERASE Комбинирует цвета исходных и целевых прямоугольников при помощи использования булева оператора ИЛИ (OR) и затем инвертирует получающийся в результате цвет.

Но оно же походу сравнивает каждый пиксель одного и второго изображения, и если будет хоть на 1 разница внесет его свою память, т.о если просто поверх всего изображения наложить маску +1 или -1 к одному из RGB составляющих(или сместить изображение на хотя бы на 1 пиксель, то разностной информации будет почти как полное изображение) он посчитает все пиксели разные, не так ли, и в результате размер разностых изменений будет равен самому рисунку и толку =0.

Последний раз редактировалось Illusiony; 26.09.2015 в 18:27.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Захват потокового видео ded26 C# (си шарп) 11 04.02.2015 15:52
Какие есть способы эмуляции мыши? sergeant.coolagin C# (си шарп) 1 14.04.2012 10:38
Способы передачи файлов BoT_T Работа с сетью в Delphi 2 26.09.2010 18:32
Какие способы есть изменения адреса памети kakawkin Общие вопросы Delphi 6 10.06.2010 16:39