Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectShow Audio- (Video-) Switch (https://www.delphipraxis.net/151571-directshow-audio-video-switch.html)

TERWI 23. Mai 2010 15:21


DirectShow Audio- (Video-) Switch
 
Ich habe einen Graphen, in dem 2 AV-Quellen (z.B. File, DVB) auf einen VMR9 laufen (Input 0 und 1).
Jeweils eine Quelle ist sozusagen der 'Master' und läuft im Vollbild.
Die andere Quelle liegt dann wie ein PIP transparent darüber.
Das funktioniert so weit gut.

Nun suche ich nach einem DS-Filter, mit dem ich die Audio's der jeweiligen Quellen umschalten kann.
Hat jemand so was schon mal gemacht oder weiß, wo es so was gibt ?

Völlig genial wäre ein DS-Sound-Device mit mehreren Eingängen wie der VMR, wo man die Lautsärke der jeweiligen Inputs regeln könnte....

xaromz 23. Mai 2010 15:33

Re: DirectShow Audio- (Video-) Switch
 
Hallo,

es gibt doch den Morgan Stream Switcher, der ist eigentlich für Videos mit mehreren Soundspuren gedacht. Der Switcher hat mehrerer Audio-Eingänge und einen Ausgang. Findest Du im Netz.

Gruß
xaromz

TERWI 23. Mai 2010 15:58

Re: DirectShow Audio- (Video-) Switch
 
.... wer 'RICHTIG' lesen kann ist klar im Vorteil
Ich hatte vorhin schon in diesem Thread gelesen, aber das mit der Ton-Spur wohl falsch interpretiert.
Dachte, er meint die verschiedenen Audio-PID's ...

Eben mal schnell gezogen, installiert und mit GraphStudio was gebaut - siehe da:
Genau das was ich suche !

Muss ich nur noch mal was im Proggie basteln und deinen Source zum Umschalten einfügen.
Hast du da evtl. den Source ? Der Link zur COrdeCodec-Seite auf der Morgan-Page lüppt nicht wirklich.

:dancer: TERWI

TERWI 23. Mai 2010 16:00

Re: DirectShow Audio- (Video-) Switch
 
Aprospos Audio-PID's im Stream:
Hast du oder jemand anderes zufällig eine Idee, wie man im Haali-Splitter (oder andere) die Audio-PID's per Proggie auslesen und umstellen kann ?

xaromz 23. Mai 2010 16:14

Re: DirectShow Audio- (Video-) Switch
 
Hallo,

ich hab das damals so gelöst:
Delphi-Quellcode:
uses DirectShow, ActiveX;

function GetOutputPin(const BF: IBaseFilter): IPin;
var
  EP: IEnumPins;
  PD: PIN_DIRECTION;
begin
  if BF.EnumPins(EP) = S_OK then
  begin
    while (EP.Next(1, Result, nil) = S_OK) do
    begin
      if (Result.QueryDirection(PD) = S_OK) and (PD = PINDIR_OUTPUT) then
        Exit;
      Result := nil;
    end;
  end;
end;

function FindAudioSwith(const FG: IFilterGraph): IBaseFilter;
var
  EF: IEnumFilters;
  Pin: IPin;
  SS: IAMStreamSelect;
  SCount: Cardinal;
  MT: TAMMediaType;
begin
  if FG.EnumFilters(EF) = S_OK then
  begin
    while (EF.Next(1, Result, nil) = S_OK) do
    begin
      if Result.QueryInterface(IID_IAMStreamSelect, SS) = S_OK then
      begin
        if (SS.Count(SCount) = S_OK) and (SCount > 1) then
        begin
          Pin := GetOutputPin(Result);
          if Assigned(Pin) and (Pin.ConnectionMediaType(MT) = S_OK) then
          begin
            if IsEqualGUID(MT.majortype, MEDIATYPE_AnalogAudio) or
               IsEqualGUID(MT.majortype, MEDIATYPE_Audio) then
              Exit;
          end;
        end;
      end;
      Result := nil;
    end;
  end else
    Result := nil;
end;

procedure SetAudioStream(const FilterGraph: IFilterGraph; const Index: Integer);
var
  BF: IBaseFilter;
  SS: IAMStreamSelect;
begin
  BF := FindAudioSwith(FilterGraph);
  if Assigned(BF) then
  begin
    if BF.QueryInterface(IID_IAMStreamSelect, SS) = S_OK then
    begin
      SS.Enable(Index, AMSTREAMSELECTENABLE_ENABLE); // Evtl. Fehlerabfrage einfügen
    end;
  end;
end;
Ich hoffe, da fehlt jetzt nichts. Der Code sucht einfach nach einem Filter, der mehrere Eingänge und einen Audio-Ausgang hat. Das musst Du eventuell noch anpassen.

Gruß
xaromz

TERWI 23. Mai 2010 16:24

Re: DirectShow Audio- (Video-) Switch
 
So stand es ja auch in diesem Thread.
Brauche ich eigentlich nur die Func SetAudioStream, da ich den Filter ja selber lade.
Woher hast du die Info, das es mit BF.QueryInterface(IID_IAMStreamSelect, SS) geht ?

Funktioniert das beim Haali-Splitter auch zum umschalten der Tonspuren ?

xaromz 23. Mai 2010 16:29

Re: DirectShow Audio- (Video-) Switch
 
Hallo,
Zitat:

Zitat von TERWI
Woher hast du die Info, das es mit BF.QueryInterface(IID_IAMStreamSelect, SS) geht ?

keine Ahnung mehr. Das ist schon lange her. Ich weiß aber noch, das ich wochenlang gesucht habe.

Zitat:

Zitat von TERWI
Funktioniert das beim Haali-Splitter auch zum umschalten der Tonspuren ?

Ich habs lange nicht mehr ausprobiert, aber ich glaube, mit dem Haali-Splitter funktioniert es nicht.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz