Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
LeoAm
Member

Откуда:
Сообщений: 20
Здравствуйте

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

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

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

Возможно есть эксперты в области DirectShow, буду признателен.
16 окт 19, 16:15    [21995696]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
ёёёёё
Member

Откуда:
Сообщений: 2017
LeoAm
...
- видеопоток с вебкамеры (как его получить и отобразить - представляю)
- видеофайл с прозрачным фоном (как его проиграть - представляю)
...

Если бы ты "представлял" - вопросов бы не было.
16 окт 19, 16:17    [21995700]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26777
LeoAm
объединить два видеопотока.

В гугле "directshow overlay", там же найдется сложение видео с видео или с текстом.

Из первых ссылок, в которых есть ключевые (английские) слова для поиска и чтения доки по sdk
pctuner.club/forum/q/4015
16 окт 19, 16:45    [21995731]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
Соколинский Борис
Member

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

DirectShow, насколько я знаю, сам не умеет рендерить два видео-источника в один приемник.
Варианты решений:
1. Сделать рендеринг самостоятельно.
2. Источник из файла сделать фильтром и вставить в граф источника камеры.
16 окт 19, 17:25    [21995776]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1179
LeoAm,
https://docs.microsoft.com/en-us/windows/win32/directshow/vmr-with-multiple-streams--mixing-mode
Вот тут описано вкратце.
16 окт 19, 19:30    [21995827]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
LeoAm
Member

Откуда:
Сообщений: 20
ёёёёё
Если бы ты "представлял" - вопросов бы не было.

Спасибо за содержательное пояснение! К моему сожалению я не эксперт в данной области, но используя советы других, кто ранее столкнутся с подобной задачей пытаюсь разобраться.


wadman
pctuner.club/forum/q/4015


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


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

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 файл:
Result := pGraph.AddSourceFilter('E:\overlay.gif', 'SourceFile2', pSource2);

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


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

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

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

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

В чем может быть нюанс?
17 окт 19, 14:29    [21996571]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26777
LeoAm
Если ли же в качестве оверлея использовать видео файл с прозрачностью:

Что такое "видео с прозрачностью"? Откуда она там?
17 окт 19, 15:57    [21996687]     Ответить | Цитировать Сообщить модератору
 Re: DirectShow - наложение видео-оверлея на видео с вебкамеры  [new]
LeoAm
Member

Откуда:
Сообщений: 20
wadman,

Видео с Альфа-каналом
[url=]www.youtube.com/watch?v=Y0TZc4DmzoE[/url]
17 окт 19, 16:09    [21996704]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить