Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 19.04.2011
Сообщений: 23
1

Трансляция изображения рабочего стола на сервер (сайт)

21.01.2013, 11:53. Просмотров 9639. Ответов 36
Метки нет (Все метки)


Всем привет.
Есть задача, разработать приложения (VS 2010 С++) для трансляции изображения рабочего стола на сервер (сайт). С серверной частью на php зная входящий формат данных я думаю разберусь, а вот с клиентской, прошу помощи... Кто что может посоветовать? С чего начать?
(понимаю, что на данную тему, типа клиент - сервер информации моря но не чего конкретного найти не удалось, поэтому прошу отнестись с пониманием и не тыкать носом в поиск, спасибо)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2013, 11:53
Ответы с готовыми решениями:

Удалённый просмотр рабочего стола (клиент-сервер)
Добрый день. Нужно написать программу для демонстрации рабочего стола. В окне серверной версии...

Трансляция рабочего стола в интернет
Привет всем. В общем надо сделать так что бы я мог транслировать то что происходит у меня на...

Прямая трансляция с рабочего стола на сайте
Здравствуйте. Недавно поступил заказ на код, который транслирует рабочий стол. И раньше...

Видео-трансляция как фон рабочего стола Windows
Нужно сделать программу которая на рабочий стол фоном вместо фотографии выводит видео из интернета....

36
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
21.01.2013, 12:50 2
вот тут сервер раздающий рабочий стол http://alphacity.netii.net/tree/prjs-web.htm

Добавлено через 1 минуту
на ваш сайт можно наверное через фрейм вывалить.
0
2 / 2 / 0
Регистрация: 19.04.2011
Сообщений: 23
21.01.2013, 13:13  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
вот тут сервер раздающий рабочий стол http://alphacity.netii.net/tree/prjs-web.htm

Добавлено через 1 минуту
на ваш сайт можно наверное через фрейм вывалить.
Спасибо. Это именно то что я хочу организовать. Но увы проект на Borland C++ Builder 6 (не когда с ним не работал), попробую конечно разобраться с функционалом принципами работы. Дело в том что разрабатываемое приложение не ограничивается функцией трансляции РС и большинство функций уже организовано и работает в проекте VS 2010 С++.

Тема по прежнему открыта.
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
21.01.2013, 15:07 4
там в MSVS переправить - пару абсолютно некритичных специфичных для BCPP функций наподобие ChangeFileExt заменить на аналоги. на днях портировал простой сервер под Linux - реально всего пару функций пришлось поправить.

Добавлено через 1 минуту
...это вообще мой серв, хотите попробую для вас вышвырнуть VCL-специфику
0
2 / 2 / 0
Регистрация: 19.04.2011
Сообщений: 23
21.01.2013, 22:29  [ТС] 5
Цитата Сообщение от vxg Посмотреть сообщение
Добавлено через 1 минуту
...это вообще мой серв, хотите попробую для вас вышвырнуть VCL-специфику
если вас это не затруднит, буду признателен... а завтра постараюсь взяться за ваш серв посерьёзней, сегодня провёл весь день в поисках чего-то подобного, увы нечего стоящего не нашёл.. я так понял вы его с нуля писали?

Добавлено через 2 часа 57 минут
Цитата Сообщение от marks90 Посмотреть сообщение
Всем привет.
Есть задача, разработать приложения (VS 2010 С++) для трансляции изображения рабочего стола на сервер (сайт). С серверной частью на php зная входящий формат данных я думаю разберусь, а вот с клиентской, прошу помощи... Кто что может посоветовать? С чего начать?
(понимаю, что на данную тему, типа клиент - сервер информации моря но не чего конкретного найти не удалось, поэтому прошу отнестись с пониманием и не тыкать носом в поиск, спасибо)
Дополнение:
Захват полного рабочего стола (тоесть, что пользователь видит на дисплее то и транслируется на сервер), в том числе и динамические приложения типа: видео, игры и т.п.
С возможностью регулировки формата и разрешения получаемой картинки, так же по возможности минимизировать(сжать) исходящие пакеты таким образом чтобы при приёме на php (части сервера) их можно было восстановить в исходное состояние. Приложение без интерфейса, консольного типа с рабочим процессом в фоновом режиме.

Предположительная(моя дилетантская :blush: ) структуры будущей программы:
Циклически совершаем скриншоты экрана с периодичностью равной времени выгрузки одного скриншота, таким образом добиваемся потоковой передачи.
Для передачи предположительно планирую воспользоваться WinInet метод (GET) по протоколу http с имитацией передачи "через форму".
По поводу дополнительных возможностей типа: сжатие, и обработка изображений даже предположить не могу ..
********************
Возможно я сейчас сморозил глупость и всё это делается совершенно по другому :-? , с удовольствием рассмотрю любую предложенную версию...
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
22.01.2013, 02:10 6
Цитата Сообщение от marks90 Посмотреть сообщение
с нуля писали
да
Цитата Сообщение от marks90 Посмотреть сообщение
Дополнение
так и работает - делает снимки и отдает их при получении GET запроса от скрипта работающего на странице. разрешение и качество задаются в параметрах запроса.
Цитата Сообщение от marks90 Посмотреть сообщение
по возможности минимизировать(сжать) исходящие пакеты
это я не понял. отдается JPEG по идее даже если сжимать трафик ничего не выиграть.
---
ковырнул программу - самое нудное место - это когда придется средствами WinAPI создавать BMP и потом средствами FreeImage сохранять его в памяти в формате JPEG. остальное все тривиально.
0
2 / 2 / 0
Регистрация: 19.04.2011
Сообщений: 23
22.01.2013, 23:15  [ТС] 7
Вот что получилось: (пока только скриншоты)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    #include "stdafx.h"
    #include <windows.h>
    #include <GdiPlus.h>
    #include <iostream>
    #pragma comment( lib, "gdiplus" )
     
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
     
    void gdiscreen()
    {
        using namespace Gdiplus;
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
            {
                HDC scrdc, memdc;
                HBITMAP membit;
                scrdc = ::GetDC(0); // Дескриптор окна 0 - на весь экран
                int Height = GetSystemMetrics(SM_CYSCREEN);// получаем полную ширену экрана
                int Width = GetSystemMetrics(SM_CXSCREEN); // получаем полную высоту экрана
                memdc = CreateCompatibleDC(scrdc); // дескриптор целевого DC
                membit = CreateCompatibleBitmap(scrdc, Width, Height); // создает точечный рисунок, совместимый с устройством
                HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
                BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY); //выполняет передачу битовых блоков данных о цвете
                Gdiplus::Bitmap bitmap(membit, NULL); //Инициализирует новый экземпляр класса Bitmap из указанного точечного рисунка membit.
                CLSID clsid;
                GetEncoderClsid(L"image/jpeg", &clsid); //преобразует последовательность символов Юникода в закодированную последовательность байтов (кодировщик для растрового изображения).
                bitmap.Save(L"C:\\1.jpeg", &clsid);
                Image* imageLoad = new Image(_T("C:\\1.jpeg"));
                Bitmap* imageSave =(Bitmap*)imageLoad->GetThumbnailImage(800,600);// <--размер
                if(imageSave->Save(_T("C:\\2.jpeg"), &clsid, NULL)==Ok)
                    _tprintf(_T("Image saved\n"));
                delete imageLoad;
                delete imageSave;
                DeleteObject(memdc);
                DeleteObject(membit);
                ::ReleaseDC(0,scrdc);
                SelectObject(memdc, hOldBitmap);
            }
        GdiplusShutdown(gdiplusToken);
    }
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
        {
            using namespace Gdiplus;
            UINT num = 0; // number of image encoders
            UINT size = 0; // size of the image encoder array in bytes
            ImageCodecInfo* pImageCodecInfo = NULL;
            GetImageEncodersSize(&num, &size);
            if(size == 0)
            return -1; // Failure
            pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
            if(pImageCodecInfo == NULL)
            return -1; // Failure
            GetImageEncoders(num, size, pImageCodecInfo);
            for(UINT j = 0; j < num; ++j)
                {
                    if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
                        {
                            *pClsid = pImageCodecInfo[j].Clsid;
                            free(pImageCodecInfo);
                            return j; // Success
                        }
                }
            free(pImageCodecInfo);
            return 0;
        }
    int namber = 0;
    int main()
        {
            for(;;){
                namber++;
                gdiscreen();
                std::cout << "Scrin #" << namber  << " Ok." << std::endl;
                HANDLE TimeEvent = CreateEvent(0, false, false, 0);
                WaitForSingleObject(TimeEvent, 0.1*10*100);
                CloseHandle(TimeEvent);
            }
     
        }
Работает, но пока ещё с кучей недостатков, но думаю всё решаемо, опишу в кратце может кто чего подскажет.
1.Уменьшение размера скриншота (строки 30-35) хотелось бы обрабатывать фаил до его сохранения.. а то так их 2 получается до и после.
2.Есть маленькая утечка памяти поймать не удалось..
3.на скринах нет мыши...
4.кодировщик jpeg слишком качество уменьшает
спасибо.
1
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 10:53 8
Цитата Сообщение от marks90 Посмотреть сообщение
Работает
неплохая работа. я сам пока с отверткой пыхтел вокруг BITMAP вспотел весь. сегодня победил. по ссылке выложена адаптация не привязанная к VCL http://alphacity.netii.net/tree/prjs-web.htm (desktop preview win)

Добавлено через 8 часов 31 минуту
...немного подправил код. теперь на выбор можно собирать консоль или "стелс"

Добавлено через 9 минут
Цитата Сообщение от marks90 Посмотреть сообщение
утечка памяти
мб нет вызова DeleteObject для битмапа + для контекста нужен DeleteDC вместо DeleteObject

Добавлено через 14 минут
... ну и вызов SelectObject(memdc, hOldBitmap) после удаления контекста выглядит как то неправильно

Добавлено через 21 минуту
Цитата Сообщение от marks90 Посмотреть сообщение
хотелось бы обрабатывать фаил до его сохранения
в моем проекте так и делается - все в памяти
Цитата Сообщение от marks90 Посмотреть сообщение
кодировщик jpeg слишком качество уменьшает
мб его как нибудь настроить... у меня в явной форме задается качество от 1 до 100%
Цитата Сообщение от marks90 Посмотреть сообщение
на скринах нет мыши
вот тут честно говоря не знаю даже что предпринять.... снимки экрана штампуют собственно экран. как показать мышь... если по-извращенному - мб запросить координаты мыши и текущий курсор и нарисовать его на снимке..
1
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 11:03 9
сегодня провёл весь день в поисках чего-то подобного, увы нечего стоящего не нашёл
VLC API не? Функция трансляции рабочего стола. Если использовать MJPEG кодировку, то на страничке (на сайте) достаточно тега IMG для отображения в firefox.

запросить координаты мыши и текущий курсор и нарисовать его на снимке
+1
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 11:11 10
...ну да, так и есть. добавить после BitBlt
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    CURSORINFO ci;
    ci.cbSize = sizeof(ci);
    GetCursorInfo(&ci);
 
    ICONINFO ii;
    GetIconInfo(ci.hCursor, &ii);
 
    DrawIcon
    (
        bmp_hdc,
        ci.ptScreenPos.x - ii.xHotspot,
        ci.ptScreenPos.y - ii.yHotspot,
        ci.hCursor
    );
Добавлено через 1 минуту
Цитата Сообщение от raxp Посмотреть сообщение
VLC API не
в смысле?
Цитата Сообщение от raxp Посмотреть сообщение
для отображения в firefox
а как быть с другими? в HTML5 тоже достаточно VIDEO или чего там для того что бы "все было в шоколаде"
1
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 11:51 11
в смысле?
в прямом.

в HTML5 тоже достаточно
никто не запрещает.

а как быть с другими?
использовать плеер флэшевый, благо полно онлайн-конструкторов.
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 12:04 12
Цитата Сообщение от raxp Посмотреть сообщение
в прямом
снова не понял. я же не для поговорить спрашиваю. компонента в VCL что ли есть для таких вещей? или VCL = API. что значит фраза?
Цитата Сообщение от raxp Посмотреть сообщение
плеер флэшевый
да, я тоже воодушевился флеш, навоял на AS3 скрипт который бы делал двойную буферизацию принимаемых снимков и после этого выяснил что мой "супер-дупер" телефон тупо показывает значок шоквэйв вместо флешек на странице... поэтому съехал на понимаемые даже кофеваркой методы
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 12:22 13
...у меня тег IMG позволяет смотреть даже недобраузером нокии 6230.

снова не понял. я же не для поговорить спрашиваю. компонента в VCL что ли есть для таких вещей? или VCL = API. что значит фраза?
см. выше, не VCL, а VLC.

http://www.videolan.org/vlc/
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 12:54 14
Цитата Сообщение от raxp Посмотреть сообщение
не VCL, а VLC
о. понял, я сглупил. это вы в смысле: через VLC раздавать MJPEG.
Цитата Сообщение от raxp Посмотреть сообщение
тег IMG
сам тег IMG распознается практически всеми устройствами - у меня серв на нем и сделан. только мне приходится его обновлять... не могли бы вы привести пример как вы смотрите через этот тег видео которое вещается в формате MJPEG?
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 13:52 15
...просто вставляю ссылку вещания в MJPEG-потоке между тегами IMG и смотрю в Firefox видео, в опере такой финт разумеется не катит (она бесконечно подгружает и отображает первый кадр).

Если же грузить (обновлять), скажем на FTP хостинге сайта, просто картинку, то ее обновление для визуализации можно осуществить простейшим скриптом автообновления (как это я делал при трансляции WEB-камеры себе на сайт своей утилитой):
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script language="JavaScript"> 
function go()
{
  var now = new Date();
  var stamp= parseInt(now.getTime() / 1000);
  document.images.webcam.src="path/image.jpg?"+stamp;
  setTimeout("go()", 5000);
}
setTimeout("go()", 5000);
</script>
<body>
 
<div align="center">
<b>TEST THREAD WEBCAM</b><br><br>
<img src="path/image.jpg" name="webcam"><br>
http://raxp.radioliga.com/webcam/
(сейчас ничего не транслируется)

Добавлено через 5 минут
это вы в смысле: через VLC раздавать MJPEG.
и раздавать и им же захватывать рабочий стол.
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 14:22 16
Цитата Сообщение от raxp Посмотреть сообщение
ссылку вещания в MJPEG-потоке между тегами IMG
как она выглядит? стандартный тег IMG подразумевает просто ссылку на рисунок. у ссылки на вещание какой-то свой формат? или фокс телепатически чует что там постоянно обновляющаяся картина?
Цитата Сообщение от raxp Посмотреть сообщение
обновление для визуализации можно осуществить простейшим скриптом
да, по сути примерно так и делаю. правда у меня там обвес всего этого дела в виде задания частоты смены кадров, подгонки отображаемого рисунка под экран с сохранением пропорций и центрированием, задания качества рисунка и фактически отображаемого размера в запросе с целью снизить трафик.

Добавлено через 2 минуты
...кстати в начале хотел отдавать картину из файла который постоянно обновляла другая программа, но были глюки когда две программы начинали рвать друг у друга файлы - на сайт приходили битые картины. а у вас как умудряется работать? проги лочат друг друга каким-то образом?
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 15:24 17
как она выглядит? стандартный тег IMG подразумевает просто ссылку на рисунок. у ссылки на вещание какой-то свой формат?
вот прямо потоковую ссылку и вставляете, для примера вставьте между тегами IMG любую укртелекомовскую камеру, они как раз в MJPEG-е отдают поток.

или фокс телепатически чует что там постоянно обновляющаяся картина?
поток MJPEG сам по себе состоит из отдельных картинок и фокс и любой уважающий себя бразер понимают этот формат.

...кстати в начале хотел отдавать картину из файла который постоянно обновляла другая программа, но были глюки когда две программы начинали рвать друг у друга файлы - на сайт приходили битые картины. а у вас как умудряется работать?
и сразу закономерный вопрос - зачем две проги одновременно? Нет, таких коллизий не решал, ибо не допускал, ибо зачем?
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
23.01.2013, 15:35 18
Цитата Сообщение от raxp Посмотреть сообщение
ибо зачем
а зачем тогда через файл гнать? отдавать картину из памяти... с MJPEG попробую, если честно шокирован..
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
23.01.2013, 21:15 19
а зачем тогда через файл гнать?
откуда картинку брать неважно, а вот файлом, ибо по FTP на свой хост для последующего отображения ...по-большей части, такой способ скорее чтобы не светить адрес трансляции.
1
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,231
24.01.2013, 09:59 20
Цитата Сообщение от raxp Посмотреть сообщение
MJPEG
попробовал. дома с сетевой камерой не вышло: она может отдавать только через RTSP, а IMG забирает только через HTTP. почитал http://habrahabr.ru/post/115808/ да, действительно можно таким образом отдавать картины, интересная штука.
преимущество: на странице нужен код в одну строку. если конечно браузер понимает MIME multipart/x-mixed-replace.
недостаток: нельзя менять частоту кадров, разрешение и качество (если сервер поддерживает указание этих параметров в запросе) без разрыва соединения. еще немного не нравиться что сервер постоянно отдает. до тех пор пока я не прочел о том, как он отдает я себе нафантазировал, что вместе с MIME приходит время до готовности следующего кадра и браузер через это время делает повторный запрос. хотя постоянная отдача - не криминал, мы же вещаем. наверное тоже прикручу к своему серверу эту фишку.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2013, 09:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Изменение изображения рабочего стола
Нужно изменить фон. рис. рабочего стола без перезагрузок и т.п., использую...

Обработка изображения рабочего стола
Всем доброго времени суток. По задаче для начала нам необходимо получить скрин с экрана, после...

Смена изображения рабочего стола
Доброго времени суток. Возможно ли организовать контейнер, где будет храниться изображение, которое...

Положение изображения фона рабочего стола
Доброго времени суток! Столкнулся с такой проблемой: меняю положение фона рабочего стола на любое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.