Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DirectShow - наложение видео-оверлея на видео с вебкамеры / 8 сообщений из 8, страница 1 из 1
16.10.2019, 16:15
    #39877173
LeoAm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
Здравствуйте

Исходные данные:
- видеопоток с вебкамеры (как его получить и отобразить - представляю)
- видеофайл с прозрачным фоном (как его проиграть - представляю)

Задача:
Во время трансляции изображения с вебкамеры накладывать поверх видео из файла - т.е. объединить два видеопотока.

Среда разработки - Delphi

Возможно есть эксперты в области DirectShow, буду признателен.
...
Рейтинг: 0 / 0
16.10.2019, 16:17
    #39877176
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
LeoAm...
- видеопоток с вебкамеры (как его получить и отобразить - представляю)
- видеофайл с прозрачным фоном (как его проиграть - представляю)
...
Если бы ты "представлял" - вопросов бы не было.
...
Рейтинг: 0 / 0
16.10.2019, 16:45
    #39877205
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
LeoAmобъединить два видеопотока.
В гугле "directshow overlay", там же найдется сложение видео с видео или с текстом.

Из первых ссылок, в которых есть ключевые (английские) слова для поиска и чтения доки по sdk
pctuner.club/forum/q/4015
...
Рейтинг: 0 / 0
16.10.2019, 17:25
    #39877236
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
LeoAmЗадача:
Во время трансляции изображения с вебкамеры накладывать поверх видео из файла - т.е. объединить два видеопотока.

DirectShow, насколько я знаю, сам не умеет рендерить два видео-источника в один приемник.
Варианты решений:
1. Сделать рендеринг самостоятельно.
2. Источник из файла сделать фильтром и вставить в граф источника камеры.
...
Рейтинг: 0 / 0
16.10.2019, 19:30
    #39877273
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
...
Рейтинг: 0 / 0
17.10.2019, 14:29
    #39877717
LeoAm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
ёёёёёЕсли бы ты "представлял" - вопросов бы не было.
Спасибо за содержательное пояснение! К моему сожалению я не эксперт в данной области, но используя советы других, кто ранее столкнутся с подобной задачей пытаюсь разобраться.


wadmanpctuner.club/forum/q/4015

s62LeoAm,
https://docs.microsoft.com/en-us/windows/win32/directshow/vmr-with-multiple-streams--mixing-mode
Вот тут описано вкратце.

Признателен за ссылки. Помогли!

Код: pascal
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.
var
  pBuild: ICaptureGraphBuilder2 = nil;
  pGraph: IGraphBuilder = nil;
  pRenderer: IBaseFilter = nil;
  pSource: IBaseFilter = nil;
  pSource2: IBaseFilter = nil;
  pConfig: IVMRFilterConfig9 = nil;
  pMixControl: IVMRMixerControl9 = nil;
  pMediaControl: IMediaControl = nil;
  pVideoWindow: IVideoWindow = nil;

procedure TForm1.Button1Click(Sender: TObject);
var
  Result: HRESULT;
begin
  Result := CoInitialize(nil);
  if (FAILED(Result)) then
    exit;

  Result := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, pBuild);
  if (FAILED(Result)) then
    exit;

  Result := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, pGraph);
  if (FAILED(Result)) then
    exit;

  pBuild.SetFiltergraph(pGraph);

  Result := CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, pRenderer);
  if (FAILED(Result)) then
    exit;

  Result := pGraph.AddFilter(pRenderer, 'VideoRenderer');
  if (FAILED(Result)) then
    exit;

  Result := pRenderer.QueryInterface(IID_IVMRFilterConfig9, pConfig);
  if (FAILED(Result)) then
    exit;

  Result := pConfig.SetNumberOfStreams(2);
  if (FAILED(Result)) then
    exit;

  Result := pRenderer.QueryInterface(IID_IVMRMixerControl9, pMixControl);
  if (FAILED(Result)) then
    exit;

  Result := pGraph.AddSourceFilter('E:\1.avi', 'SourceFile', pSource);
  if (FAILED(Result)) then
    exit;

//  Result := pGraph.AddSourceFilter('E:\overlay.mov', 'SourceFile2', pSource2);
  Result := pGraph.AddSourceFilter('E:\overlay.gif', 'SourceFile2', pSource2);
  if (FAILED(Result)) then
    exit;

 Result := pBuild.RenderStream(nil, nil, pSource, nil, pRenderer);
  if (FAILED(Result)) then
    exit;

  Result := pBuild.RenderStream(nil, nil, pSource2, nil, pRenderer);
  if (FAILED(Result)) then
    exit;

  Result := pRenderer.QueryInterface(IID_IVideoWindow, pVideoWindow);
  if (FAILED(Result)) then
    exit;

  pVideoWindow.put_Owner(Handle);
  pVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
  pVideoWindow.SetWindowPosition(0,0,ClientWidth,ClientHeight);

//  Result := pMixControl.SetAlpha(1,0.5);
//  Result := pMixControl.SetBackgroundClr(D3DCOLOR_ARGB(128,255,255,255));

  Result := pGraph.QueryInterface(IID_IMediaControl, pMediaControl);
  if (FAILED(Result)) then
    exit;

  Result := pMediaControl.Run();
  if (FAILED(Result)) then
    exit;
end;




Столкнулся со следующей проблемой:

Если в качестве оверлея использовать GIF файл:
Код: pascal
1.
Result := pGraph.AddSourceFilter('E:\overlay.gif', 'SourceFile2', pSource2);


- все идеально. GIF накладывается с прозрачностью.


Если ли же в качестве оверлея использовать видео файл с прозрачностью:
Код: pascal
1.
Result := pGraph.AddSourceFilter('E:\overlay.mov', 'SourceFile2', pSource2);


- то никакой прозрачности - нет. Ролик оверлея использует черный фон вместо прозрачности.

Можно выполнить:
Код: pascal
1.
pMixControl.SetAlpha(1,0.5);


Но в таком случае получается размазанный оригинальный ролик и оверлей.

В чем может быть нюанс?
...
Рейтинг: 0 / 0
17.10.2019, 15:57
    #39877775
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
LeoAmЕсли ли же в качестве оверлея использовать видео файл с прозрачностью:
Что такое "видео с прозрачностью"? Откуда она там?
...
Рейтинг: 0 / 0
17.10.2019, 16:09
    #39877780
LeoAm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DirectShow - наложение видео-оверлея на видео с вебкамеры
wadman,

Видео с Альфа-каналом
www.youtube.com/watch?v=Y0TZc4DmzoE
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DirectShow - наложение видео-оверлея на видео с вебкамеры / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]