Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
#1

Воспроизведение видео в окне с известным Handle - C++

13.08.2013, 18:01. Просмотров 925. Ответов 17
Метки нет (Все метки)

Всем привет.
Необходимо вывести видео в окно, handle которого известен. Насколько я понимаю, есть несколько путей решения:
1. DirectShow
2. Microsoft Media Foundation
3. Нечто самописное
Хотелось бы выслушать мнения по этому поводу, что лучше/предпочтительнее. Может быть, у кого-то есть подобный опыт и он подскажет наиболее простое решение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2013, 18:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Воспроизведение видео в окне с известным Handle (C++):

Воспроизведение avi-видео на C++ - C++
Нужен исходник на лёгенькую программу, написанную на C++, воспроизводящий видео в формате avi

Воспроизведение видео из сети - C++
есть у меня приложение клиент и сервер. работает все через протокол tcp/ip. хотелось бы дополнить свою программу возможностью...

DirectShow: захват видео с веб-камеры, воспроизведение - C++
Посоветуйте для начала понятный мануал, что-бы можно было с нуля разобраться (желательно без воды). У меня стоит win7, DirectShow беру...

Вычисления по известным формулам - C++
Составить программу вычисления значения функции y=\frac{{a}^{2}+10}{\sqrt{{a}^{2}+1}} при любом значении а

Получить информацию об окне, зная его handle - C#
Подскажите, как зная хендл окна получить о нем информацию(есть ли в этом окне кнопки, сколько, их местоположение, название, цвет окна, ну...

Как получить информацию о другом окне, зная его Handle - C#
Как получить информацию о другом окне если есть Хендл(расположение, заголовок, размеры и т.д.)? И чтобы не сорить в форуме еще один...

17
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
13.08.2013, 18:31 #2
когда то делал вот держи(что бы выбрать фильм и воспроизвести нажми пробел)
1
Вложения
Тип файла: rar Project1.rar (8.1 Кб, 39 просмотров)
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
21.08.2013, 19:02  [ТС] #3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
когда то делал вот держи(что бы выбрать фильм и воспроизвести нажми пробел)
Честно говоря, многого не понял. Хотя сам код вроде бы элементарный...
Несколько вопросов:
1) В методе InitVideoControl происходит создание нового окна MCIWndCreate(...). Однако воспроизведение видео происходит в главном окне.
2) На правую кнопку мыши открывается меню. Где оно описано?
3) И наконец, главный вопрос: как мне передать MCI имя своего файла и сделать так, чтобы он воспоизвелся в моем (не новом) окне?
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
21.08.2013, 19:32 #4
Цитата Сообщение от Inflight Посмотреть сообщение
Несколько вопросов
читаем msdn и все вопросы уходят сами по себе
0
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
22.08.2013, 18:10  [ТС] #5
Цитата Сообщение от Игорь с++ Посмотреть сообщение
читаем msdn и все вопросы уходят сами по себе
Отлично, я добился, чтобы видео воспроизводилось в моём окне. И всё здорово в оконном режиме, видео воспроизводится, перекрывая всё, что есть в окне.
Однако в полноэкранном режиме всё не так хорошо: видео вроде запускается, но его не видно, виден чёрный экран. Я делал и SetActiveWindow, и InvalidateRect, и UpdateWindow, и SetForegroundWindow, и SetFocus. И всё это и для handle основного окна, и для handle видео. В чём может быть беда?
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
22.08.2013, 19:01 #6
Проблемы быть не должно если Вы не где не накосячили.
0
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
22.08.2013, 20:18  [ТС] #7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Проблемы быть не должно если Вы не где не накосячили.
Забавно, что при переходе из полноэкранного режима в оконный через Alt-Tab видео в окошке показывается. При переходе обратно опять слышен только звук. Где я мог ошибиться?
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
s3eResult s3eWinAPIPlayVideo_platform()
{
    HWND hWnd = s3eEdkGetHwnd();
 
    ghMciWindow = MCIWndCreate(s3eEdkGetHwnd(), ghInstance, MCIWNDF_NOPLAYBAR, _T("c:\\intro.mpg"));
        
    if(MCIWndCanPlay(ghMciWindow))
           {
        MCIWndPlay(ghMciWindow);
    }
    ShowWindow(ghMciWindow, SW_SHOWMAXIMIZED);
    UpdateWindow(ghMciWindow);
    SetForegroundWindow(ghMciWindow);
    SetFocus(ghMciWindow);
    mciSendString(L"play fullscreen", NULL, 0, s3eEdkGetHwnd());
 
    InvalidateRect(s3eEdkGetHwnd(), 0 , true);
    SetActiveWindow(s3eEdkGetHwnd());
    UpdateWindow(s3eEdkGetHwnd());
    SetForegroundWindow(s3eEdkGetHwnd());
    SetFocus(s3eEdkGetHwnd());
 
    return S3E_RESULT_SUCCESS;
}
Добавлено через 41 минуту
Ну и вопрос в догонку: когда я во время воспроизведения выбираю пункт меню "отправить команду" и ввожу "play fullscreen", видео разворачивается на полный экран. Но когда я пишу в коде
C++
1
mciSendString(L"play fullscreen", NULL, NULL, ghMciWindow);
ничего не происходит?
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
22.08.2013, 22:47 #8
честно не знаю где косяк , но попробуй такой способ - узнай разрешение экрана (програмно) и тупо растени окно на сколько надо
0
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
23.08.2013, 14:04  [ТС] #9
Вот это сработало:
C++
1
mciSendString(L"play c:\\intro.mpg fullscreen", NULL, NULL, ghMciWindow);
Добавлено через 2 часа 45 минут
Цитата Сообщение от Игорь с++ Посмотреть сообщение
честно не знаю где косяк , но попробуй такой способ - узнай разрешение экрана (програмно) и тупо растени окно на сколько надо
А при таком способе будет видна рамка или title окна с видео? Хочется, чтобы нет.
Просто когда я делаю mciSendString(L"play c:\\intro.mpg fullscreen", NULL, NULL, ghMciWindow), то не могу перехватить сообщения о нажатии клавиш (чтобы завершить видео).
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
23.08.2013, 14:36 #10
рамка не будет видна . а по поводу что не можеш отлавить нажатие, смотри в сторону сабкласинг. код показать пока не могу с телефона сижу,если хочеш вечером покажу.
1
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
23.08.2013, 19:30  [ТС] #11
Цитата Сообщение от Игорь с++ Посмотреть сообщение
рамка не будет видна . а по поводу что не можеш отлавить нажатие, смотри в сторону сабкласинг. код показать пока не могу с телефона сижу,если хочеш вечером покажу.
Был бы очень признателен)

Добавлено через 1 час 46 минут
И кстати, как сделать полный экран без рамки? Я пытался
mciSendString(L"put movie window at 0 0 1920 1080", 0, 0, 0);
но видна и рамка, и заголовок.

Добавлено через 2 часа 34 минуты
ОК, вроде сделал без рамки, реагирует на нажатия, но тут другая напасть...
Дело в том, что основное приложение, вызывая новое окно с видео, остаётся "наверху". Видео хоть и запускается, но в неактивном окне и его не видно. Если переключить через Alt-Tab, то всё ОК.
SetActive, SetForeground и иже с ними не помогли. Видимо, дело в gwStyle окон. Какие должны быть стили для корректной работы?
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
23.08.2013, 21:58 #12
так сделай SetParent и всё , вообщем смотри там и сабкласинг и остальное
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <windows.h>
 
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
WNDPROC DefProc;
 
HWND hw;
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
LRESULT CALLBACK NewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
static char a[2];
        
    switch(message)
    {
 
case WM_CHAR:
     
     if(wParam==27){PostQuitMessage (0);}
        
        else{
       
       a[0]=CHAR(wParam);
             
             MessageBoxA(hwnd,a,"",MB_OK);
             
             }
        
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefProc,hwnd,message,wParam,lParam));
}
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
           
           case WM_CREATE:
                
    mciSendString("open C:\\1.wmv type mpegvideo alias myFile",0, 0, hwnd);
 mciSendString("play myFile ", 0,0, hwnd);
           
 hw=FindWindow(NULL,"C:\\1.wmv");
 
 DefProc = (WNDPROC)GetWindowLongPtr(hw,GWLP_WNDPROC);
            SetWindowLongPtr(hw,GWLP_WNDPROC,(LPARAM)NewProc);
 
SetParent(hw,hwnd);
          
                break;
           
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
1
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
26.08.2013, 19:49  [ТС] #13
Цитата Сообщение от Игорь с++ Посмотреть сообщение
так сделай SetParent и всё , вообщем смотри там и сабкласинг и остальное
Увы, SetParent не помог. Сабклассинг ок, появился ещё вопрос: как нейтрализовать появляющееся по клику правой кнопи мыши меню? Тоже через сабклассинг?
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.08.2013, 21:53 #14
Цитата Сообщение от Inflight Посмотреть сообщение
как нейтрализовать появляющееся по клику правой кнопи мыши меню? Тоже через сабклассинг?
Ага .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT CALLBACK NewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
 
    switch(message)
    {
 
case WM_RBUTTONDOWN:
 
    return 0;
 
    break;
 
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefProc,hwnd,message,wParam,lParam));
}
1
Inflight
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 30
27.08.2013, 11:45  [ТС] #15
Огромное спасибо за ответы, практически всё получилось. Осталась одна неприятность - чёрный экран. Чтобы увидеть видео, надо нажать Alt-Tab, хотя фокус у окна с видео есть, работают сочетания Ctrl-S и Ctrl-P.
Пробовал и SetParent в разных комбинациях, и SetActive, SetForeground, UpdateWindow - ничего не помогает. Мистика какая-то! Есть может какой-нибудь способ принудительно показывать видео?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 11:45
Привет! Вот еще темы с ответами:

Воспроизведение видео - C#
Подскажите что не так, ошибка когда нажимаю на PictureBox. using System; using System.Collections.Generic; using...

Воспроизведение видео - Lazarus
Подскажите пожалуйста как в Лазарусе воспроизвести видео под linux Ubuntu, в формате avi?

Воспроизведение видео - C++ WinAPI
Суть вот в чем: после совершения некого действия на консоли, нужно запустить окно, в котором будет проигрываться видео, и, желательно,...

Воспроизведение видео - C#
Как в Windows.Forms загрузить видео? Когда я жмякаю на кнопку - &gt; появляется видео и без сигнала воспроизводится?


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
27.08.2013, 11:45
Ответ Создать тему
Опции темы

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