![]() |
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.... |
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 |
Re: DirectShow Audio- (Video-) Switch
.... wer 'RICHTIG' lesen kann ist klar im Vorteil
Ich hatte vorhin schon ![]() 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 |
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 ? |
Re: DirectShow Audio- (Video-) Switch
Hallo,
ich hab das damals so gelöst:
Delphi-Quellcode:
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.
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; Gruß xaromz |
Re: DirectShow Audio- (Video-) Switch
So stand es ja auch in
![]() 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 ? |
Re: DirectShow Audio- (Video-) Switch
Hallo,
Zitat:
Zitat:
Gruß xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz