Einzelnen Beitrag anzeigen

xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: DivX Tonspur umstellen (Switch Audio)

  Alt 21. Okt 2006, 18:55
Hallo,

ich habe mir dazu den Morgan Stream Switcher installiert und steuere den fern. Über den Filtergraph kannst Du feststellen, welcher Filter mehrere Tonspuren zur Verfügung stellt und dann eine auswählen.

Delphi-Quellcode:
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
      begin
        EP := nil;
        Exit;
      end;
      Result := nil;
    end;
    EP := nil;
  end;
end;

function FindAudioSwith(const FG: IFilterGraph): IBaseFilter;
// Sucht einen Filter, der das Umschalten von Audiospuren erlaubt
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 (Pin <> nil) and (Pin.ConnectionMediaType(MT) = S_OK) then
          begin
            if IsEqualGUID(MT.majortype, MEDIATYPE_AnalogAudio) or
               IsEqualGUID(MT.majortype, MEDIATYPE_Audio) then
            begin
              SS := nil;
              EF := nil;
              Pin := nil;
              Exit;
            end;
          end;
          Pin := nil;
        end;
        SS := nil;
      end;
      Result := nil;
    end;
    EF := nil;
  end else
    Result := nil;
end;

procedure SetAudioStream(AFilterGraph: TFilterGraph; const Index: Integer);
// Schaltet auf den angegebenen Kanal um
var
  FilterGraph: IFilterGraph;
  BF: IBaseFilter;
  SS: IAMStreamSelect;
begin
  if AFilterGraph.QueryInterface(IID_IFilterGraph, FilterGraph) = S_OK then
  begin
    BF := FindAudioSwith(FilterGraph);
    if BF <> nil then
    begin
      if BF.QueryInterface(IID_IAMStreamSelect, SS) = S_OK then
      begin
        if SS.Enable(Index, AMSTREAMSELECTENABLE_ENABLE) <> S_OK then
          Beep;
        SS := nil;
      end;
      BF := nil;
    end;
    FilterGraph := nil;
  end;
end;
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat