Вверх ↑
Этот топик читают: Гость
Ответов: 217
Рейтинг: 0
#1: 2021-11-03 17:15:57 ЛС | профиль | цитата
Подскажите пожалуйста, как можно осуществить видео захват экрана и передача его через TCP.
Суть, сервер и клиент должны обмениваться потоковым видео с экрана.
Грубо говоря, оба должны одним глазком наблюдать за происходящим на экране напарника.
Я собрал вот такой вот образец. Но он слишком медленный. А если убрать ZIP то программа просто зависает.

Add(MainForm,2953706,469,147)
{
Width=334
Height=228
Color=-16777215
Caption="R6"
BorderStyle=5
TaskBar=1
Point(Handle)
Point(doAlphaBlendValue)
Point(doVisible)
Point(doTop)
link(onCreate,10374431:doEvent1,[])
}
Add(WinTools,10617172,469,231)
{
link(Handle,2953706:Handle,[])
}
Add(TrackBar,632238,392,175)
{
Top=198
Width=334
Align=4
Color=-16777215
Max=255
Min=20
Position=100
ThumbLength=15
PageSize=20
link(onPosition,2953706:doAlphaBlendValue,[])
}
Add(Switch,7591753,343,210)
{
DataOn=String(1)
DataOff=String(0)
Default=0
link(onSwitch,6547179:doPosition,[])
}
Add(TrackBar,6547179,392,210)
{
Left=425
Top=220
Visible=1
Max=1
link(onPosition,2953706:doVisible,[(429,216)(429,188)])
}
Add(MultiElement,1440820,287,210)
{
link(onEvent1,7591753:doSwitch,[])
}
BEGIN_SDK
Add(EditMulti,522040,21,21)
{
EventCount=1
}
Add(Keyboard,12271127,133,63)
{
Key=121
link(onReadKey,10994463:doCompare,[])
}
Add(Timer,9380939,84,63)
{
Interval=50
OverCall=1
link(onTimer,12271127:doReadKey,[])
}
Add(If_else,10994463,182,63)
{
Op2=String(1)
link(onTrue,9782266:doEvent1,[])
}
Add(Keyboard,16108651,133,105)
{
Key=121
link(onReadKey,7633786:doCompare,[])
}
Add(Timer,603799,84,105)
{
Interval=50
OverCall=1
link(onTimer,16108651:doReadKey,[])
}
Add(Hub,9782266,231,63)
{
link(onEvent1,522040:onEvent1,[(283,69)(283,27)])
link(onEvent2,9380939:doStop,[(257,76)(257,64)(72,64)(72,76)])
}
Add(If_else,7633786,182,105)
{
Op2=String(1)
link(onFalse,9380939:doTimer,[(226,118)(226,94)(72,94)(72,69)])
}
END_SDK
Add(Screen,2394200,350,70)
{
}
Add(Math,16735540,357,119)
{
OpType=1
Op2=220
link(onResult,2953706:doTop,[(429,125)(429,195)])
link(Op1,2394200:Height,[])
}
Add(Hub,10374431,511,161)
{
OutCount=3
link(onEvent1,16735540:doOperation,[(537,167)(537,146)(345,146)(345,125)])
link(onEvent2,4426237:doOpen,[(537,174)(537,248)(275,248)(275,377)])
link(onEvent3,10617172:doPopup,[(537,181)(537,213)(457,213)(457,244)])
}
Add(StreamUnPack,351980,399,371)
{
DataCount=#3:png|
link(onUnPack,8079361:doData,[])
}
Add(Image,5934760,511,371)
{
Top=45
Width=495
Height=226
Align=5
ModeSp=3
ViewStyle=1
Point(Handle)
Point(onPaint)
Point(Width)
Point(Height)
}
Add(StreamPack,15537523,175,385)
{
DataCount=#3:png|
link(onPack,9818273:doCompress,[])
}
Add(ScreenShort,9116219,126,385)
{
link(onCapture,15537523:doPack,[])
}
Add(Timer,6435727,77,385)
{
Interval=100
Enable=1
link(onTimer,9116219:doCapture,[])
}
Add(TCP_Server,4426237,287,371)
{
Port=3434
DataType=3
link(onRead,7599453:doDeCompress,[])
link(onConnect,6435727:doTimer,[(331,384)(331,366)(72,366)(72,391)])
link(onDisconnect,119864:doEvent1,[(331,391)(331,429)(296,429)(296,468)])
}
Add(Hub,119864,308,462)
{
link(onEvent1,5934760:doClear,[(396,468)(396,384)])
link(onEvent2,6435727:doStop,[(334,475)(334,443)(72,443)(72,398)])
}
Add(DoData,8079361,455,371)
{
link(onEventData,5934760:doLoad,[])
link(Data,351980:png,[(461,359)(433,359)(433,415)(405,415)])
}
Add(ZLIB,9818273,224,385)
{
link(onStream,4426237:doSend,[])
}
Add(ZLIB,7599453,350,364)
{
link(onStream,351980:doUnPack,[(390,370)(390,377)])
}

карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4525
Рейтинг: 724
#2: 2021-11-03 18:35:52 ЛС | профиль | цитата
Вероятно, на существующих компонентах это невозможно сделать. Смотри в сторону сторонних консольных утилит, типа FFMPEG.

Редактировалось 1 раз(а), последний 2021-11-03 18:36:26
карма: 26

0
Ответов: 4794
Рейтинг: 538
#3: 2021-11-05 15:07:19 ЛС | профиль | цитата
Netspirit, я постарался выдавить всё что смог. Но у меня старый и слабый комп.
Раньше делал транслятор видеопотока в сеть но для видеочата его не применить, там буферизация порядка 20 секунд была.
Так что шукайте хлопцы! https://forum.hiasm.com/getfile/39299
1) запускаем сервер.
2) запускаем клиент.
3) на сервере жмакаем кнопку GO!, и поехали!
карма: 7
0
файлы: 1SCRToStream.zip [2.6KB] [41]
Ответов: 4525
Рейтинг: 724
#4: 2021-11-05 15:23:18 ЛС | профиль | цитата
andrestudio, я делал подобное на рассыпухе (ScreenShort + альтернативные TCP компоненты + сжатие в JPEG) - /topic/65137. В приципе для пробы сойдет, но грузит процессор (в основном за счет сжатия JPEG).
Интересно бы узнать как работают подобные сторонние программы (некоторые из них устанавливают свой драйвер, плюс, вероятно максимально оптимизируют алгоритмы, чтобы не так грузило процессор) и иметь отдельный компонент для такого.

Редактировалось 3 раз(а), последний 2021-11-05 16:19:39
карма: 26

0
Ответов: 4794
Рейтинг: 538
#5: 2021-11-05 15:36:56 ЛС | профиль | цитата
Netspirit, где то раньше попадалось как свзать видеопотоки через сеть с помощью моникеров (интерфейсов) там и проц не грузит и FPS хороший, примерно как с веб камеры. Но где, не помню. Нужно гуглить
Кто найдёт кинте сюда ссылочку.
карма: 7
0
Ответов: 217
Рейтинг: 0
#6: 2021-11-06 01:28:12 ЛС | профиль | цитата
Вычитал что лучше передачу осуществлять через UDP. Но не понимаю чего не получаться то.

Add(UDP,10711677,483,371)
{
LocalPort=3434
RemotePort=3435
LocalIP="127.0.0.1"
RemoteIP="127.0.0.1"
AutoConnect=0
BroadCast=0
Point(onError)
}
Add(UDP,14155054,483,427)
{
LocalPort=3435
RemotePort=3434
LocalIP="127.0.0.1"
RemoteIP="127.0.0.1"
AutoConnect=0
BroadCast=0
Point(onError)
link(onReceive,13325829:doDeCompress,[(548,433)(548,440)])
}
Add(Hub,1191191,420,231)
{
OutCount=3
link(onEvent1,10711677:doOpen,[(458,237)(458,377)])
link(onEvent2,14155054:doOpen,[(458,244)(458,433)])
link(onEvent3,2100422:doTimer,[(446,251)(446,177)(359,177)(359,104)])
}
Add(ScreenShort,9116219,420,104)
{
link(onCapture,4814477:doResize,[])
}
Add(Resize,4814477,462,104)
{
Width=400
Height=400
HalfTone=1
link(onResult,1448185:doEvent1,[(520,110)(520,111)])
}
Add(MainForm,16567777,378,217)
{
Width=639
Height=495
link(onCreate,1191191:doEvent1,[])
}
Add(Hub,1448185,546,105)
{
OutCount=3
link(onEvent1,15561524:doClear,[(584,111)(584,34)])
link(onEvent2,6485638:doWrite,[(595,118)(595,97)])
link(onEvent3,3661983:doConvert,[])
}
Add(MemoryStream,15561524,609,21)
{
}
Add(StreamConvertor,3661983,644,119)
{
link(onResult,15537523:doPack,[])
link(Data,5231647:Var3,[(650,69)])
}
Add(BitmapStream,6485638,609,84)
{
link(Stream,5231647:Var2,[])
}
Add(GetDataEx,5231647,609,64)
{
link(Data,15561524:Stream,[])
}
Add(StreamPack,15537523,693,119)
{
DataCount=#3:png|
link(onPack,8267564:doCompress,[])
}
Add(Timer,2100422,371,98)
{
Interval=30
Enable=1
link(onTimer,9116219:doCapture,[(411,104)(411,110)])
}
Add(ZLIB,8267564,735,119)
{
link(onStream,10711677:doSend,[(779,125)(779,255)(471,255)(471,384)])
}
Add(BitmapStream,3259937,770,427)
{
link(onRead,5934760:doLoad,[])
}
Add(StreamConvertor,3847167,721,427)
{
Mode=1
link(onResult,3259937:doRead,[])
}
Add(StreamUnPack,15265595,623,427)
{
DataCount=#3:png|
link(onUnPack,10538202:doData,[])
}
Add(DoData,10538202,679,427)
{
link(onEventData,3847167:doConvert,[])
link(Data,15265595:png,[(685,415)(657,415)(657,471)(629,471)])
}
Add(ZLIB,13325829,581,427)
{
link(onStream,15265595:doUnPack,[])
}
Add(Image,5934760,826,427)
{
Top=15
Width=500
Height=289
Align=5
ModeSp=3
ViewStyle=1
Point(Handle)
Point(onPaint)
Point(Width)
Point(Height)
Point(onMouseEnter)
Point(onMouseLeave)
Point(onMouseDown)
}

карма: 0

0
Ответов: 4794
Рейтинг: 538
#7: 2021-11-06 02:14:47 ЛС | профиль | цитата
egorhay, а может просто за тебя всё сделать, да делов то с концом
карма: 7
0
Ответов: 217
Рейтинг: 0
#8: 2021-11-06 02:26:23 ЛС | профиль | цитата
andrestudio писал(а):
а может просто за тебя всё сделать

А так можно?)
Я всё таки сюда за помощью пришёл. Думал форум для этого и нужен.

Редактировалось 1 раз(а), последний 2021-11-06 02:26:36
карма: 0

0
Ответов: 4794
Рейтинг: 538
#9: 2021-11-06 11:58:44 ЛС | профиль | цитата
egorhay писал(а):
А так можно?)

Да легко, все ваши прихоти за ваши деньги.
egorhay писал(а):
Я всё таки сюда за помощью пришёл. Думал форум для этого и нужен.

ты выше то посты читаешь или собственная гениальность не позволяет
карма: 7
0
Ответов: 217
Рейтинг: 0
#10: 2021-11-06 15:26:23 ЛС | профиль | цитата
andrestudio писал(а):

ты выше то посты читаешь


Я видел то что вы скинули, спасибо. Но это работает точно также как и моя схема.
Очень большие задержки в кадре на удалённом компютере.
карма: 0

0
Ответов: 232
Рейтинг: 29
#11: 2021-11-07 12:15:00 ЛС | профиль | цитата
egorhay, Мне кажется, что тебе стоит прислушаться к совету Netspirit и изучить документацию по ffmpeg.
Вот ссылки.
https://trac.ffmpeg.org/wiki/StreamingGuide
https://trac.ffmpeg.org/wiki/Capture/Desktop
Довольно внятные инструкции. Ничего сложного.
Пример
Строка для передатчика (Сервер):
ffmpeg -f gdigrab -framerate 30 -i desktop -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f mpegts udp://192.168.1.15:48550
Строка для приёмника (Клиент):
ffplay  -i udp://192.168.1.15:48550
Попробовал, всё передаётся и принимается. Исправь IP и порт приёмника на свои. И не запускай обе программы на одном ПК! Или ограничься трансляцией только одного окна.
Схемы элементарные, из одного компонента.
Сервер
Add(MainForm,2953706,105,126)
{
Point(onClose)
link(onCreate,15228189:doConsoleExec,[])
link(onClose,15228189:doConsoleTerminate,[])
}
Add(WinExec,15228189,161,126)
{
FileName="ffmpeg"
Param="-f gdigrab -framerate 30 -i desktop -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f mpegts udp://192.168.1.15:48550"
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleError)
Point(doConsoleTerminate)
link(onConsoleResult,16718623:doWork2,[])
link(onConsoleError,16718623:doWork3,[(207,153)])
}
Add(Memo,10441065,287,140)
{
Left=550
Top=160
Align=5
ScrollBars=3
}
Add(HubEx,16718623,203,140)
{
link(onEvent,1602673:doCharset,[])
}
Add(Charset,1602673,231,140)
{
link(onCharset,10441065:doAdd,[])
}

Клиент
Add(MainForm,14700257,238,105)
{
Point(onClose)
link(onCreate,15228189:doConsoleExec,[])
link(onClose,15228189:doConsoleTerminate,[])
}
Add(WinExec,15228189,294,105)
{
FileName="ffplay"
Param="-i udp://192.168.1.15:48550"
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
Point(onConsoleError)
Point(doConsoleTerminate)
}


Редактировалось 2 раз(а), последний 2021-11-07 12:19:40
карма: 5

0
Ответов: 217
Рейтинг: 0
#12: 2021-11-07 18:31:30 ЛС | профиль | цитата
Gunta писал(а):
egorhay, Мне кажется, что тебе стоит прислушаться к совету Netspirit и изучить документацию по ffmpeg.
Вот ссылки.
https://trac.ffmpeg.org/wiki/StreamingGuide
https://trac.ffmpeg.org/wiki/Capture/Desktop
Довольно внятные инструкции. Ничего сложного.


Спасибо большое!! Буду пробовать
карма: 0

0
Ответов: 217
Рейтинг: 0
#13: 2021-11-07 20:31:45 ЛС | профиль | цитата
Gunta писал(а):
ffmpeg

Не совсем понимаю по какому протоколу она работает? Не получается открыть порт даже для локальной сети.
То-есть запустить обе на одном как и советовали трансляцию отдельного окна. Работает на ура. Но запустить на другом пк в одной локальной сети так и не вышло.
В брандмауэр прописал. C обычным TCP проблемы не было, доступ "из вне" тоже норм работал. Стоит роутер, в нем тоже прописываю порты.

И еще не совсем понятно пока. как мне потом прикрутить ее к Hiasm)
Задумка такая. Мы с другом любители поиграть в шутер, и было бы полезно если бы было я мог видеть его экран в прозрачной форме. сжатой. чтобы быстро ориентироваться в ситуации )
карма: 0

0
Ответов: 232
Рейтинг: 29
#14: 2021-11-08 09:40:19 ЛС | профиль | цитата
egorhay писал(а):

Не совсем понимаю по какому протоколу она работает? Не получается открыть порт даже для локальной сети.

В своём примере я использовал UDP-протокол.
IP адрес и порт нужно указывать того куда ты отправляешь видео стрим.
В первой ссылке почитай раздел "Point to point streaming". Можно передавать изображения по разным протоколам.
А здесь "разжёвоно" очень подробно - http://morrillplou.me/blog/index.php/2019/03/04/streaming-video-over-lan-with-ffmpeg/

egorhay писал(а):
Мы с другом любители поиграть в шутер

Я уже лет 20-25 не играю и далёк от всего этого.

Редактировалось 1 раз(а), последний 2021-11-08 09:41:24
карма: 5

0
Ответов: 4525
Рейтинг: 724
#15: 2021-11-08 11:48:56 ЛС | профиль | цитата
egorhay писал(а):
То-есть запустить обе на одном как и советовали трансляцию отдельного окна. Работает на ура. Но запустить на другом пк в одной локальной сети так и не вышло.
На комп’ютере, где запускается сервер, надо в "Брендмауэре Windows" добавить правило, разрешающее входящие подключения по указанному порту либо для указанной программы.

Редактировалось 1 раз(а), последний 2021-11-08 11:49:57
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)