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

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

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

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

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

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

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


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
DirectShow - наложение видео-оверлея на видео с вебкамеры
    #39877775
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoAmЕсли ли же в качестве оверлея использовать видео файл с прозрачностью:
Что такое "видео с прозрачностью"? Откуда она там?
...
Рейтинг: 0 / 0
DirectShow - наложение видео-оверлея на видео с вебкамеры
    #39877780
LeoAm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

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


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