Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.11.2014, 22:10
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию DirectShow сменить аудиодорожку

Использую DirectShow9, как поменять аудиодорожку и вкл-выкл субтитры, в сети поиск результатов внятных не дал(((
hr := pGraphBuilder.QueryInterface(IBasicAudio, pBasicAudio);
В pBasicAudio чего то не вижу то что надо(
Пожалуйста помогите))))

Где именно она там выбирается
IAudioMediaStream?

Последний раз редактировалось ProDaNTe, 28.11.2014 в 22:16.
Ответить с цитированием
  #2  
Старый 29.11.2014, 07:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Насчёт субтитров - а у вас в системе для их отображения внешний VSFilter установлен или что-то другое используется?
Ответить с цитированием
  #3  
Старый 29.11.2014, 17:54
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Alegun, да именно DirectVobSub установлен как я понял через него и идет показ субтитров, но с субтитрами ещё можно смерится, а вот со звуковой дорожкой надо что то делать(
Ответить с цитированием
  #4  
Старый 29.11.2014, 19:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Это новое название фильтра такое, субтитры отключаются в нём, управление можно осуществить через иконку в трее. Насколько мне известно, мелкомяконький медиаплеер дорожки переключать не умеет, они воспроизводятся все вместе, и их можно лишь приглушить микшером
Ответить с цитированием
  #5  
Старый 30.11.2014, 16:27
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Прости не понял тебя, при чем здесь "мелкомяконький медиаплеер" - ведь я использую DirectShow
Ответить с цитированием
  #6  
Старый 30.11.2014, 18:24
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп:
Цитата:
Сообщение от ProDaNTe
...при чем здесь "мелкомяконький медиаплеер" - ведь я использую DirectShow
Простите, это я не понял, просто в конце графа фильтров обычно MP висит по-умолчанию

По теме: У вас зато ведь есть pBasicAudio.put_Volume, им и глушите (переключайте) выходы у рендереров

З.Ы. Кстати, есть ещё IAMStreamSelect У него правда такой расклад - пин на выходе сплиттера, один рендерер его играющий но несколько звуковых потоков, выбирающихся этим интерфейсом внутри сплиттера, возможно даже крутящих звук одновременно и это нужно учитывать
Ответить с цитированием
  #7  
Старый 30.11.2014, 19:15
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Так в этом и проблема как узнать количество дорожек и приглушить именно ту самую, спасибо за IAMStreamSelect - покопаю в эту сторону пока
Ответить с цитированием
  #8  
Старый 30.11.2014, 19:34
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Код:
pStreamSelect          : IAMStreamSelect  

    hr := pGraphBuilder.QueryInterface(IID_IAMStreamSelect, pStreamSelect);
   if hr<>0 then begin
    ShowMessage('Не удается получить интерфейс управления аудиодорожками');
    exit;
  end;

Чёт инициализировать не могу(
Ответить с цитированием
  #9  
Старый 30.11.2014, 20:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот откопал рабочий переключатель из заброшенного видеоплеера
Код:
procedure TMainForm.btnSoundSwitchClick(Sender: TObject);
var
 FList: TDSoundFilterList;
 pBasicAudio: iBasicAudio;
 i: integer;
begin
 FList:= TDSoundFilterList.Create(FilterGraph as iFilterGraph);
  try
  i:= (Sender as TButton).Tag + 1;
   if i <> FList.Count then
   begin
    FilterGraph.QueryInterface(IID_IBasicAudio, pBasicAudio);
    pBasicAudio.put_Volume(-10000);
    (Sender as TButton).Tag:= (Sender as TButton).Tag + 1;
    FList.Items[(Sender as TButton).Tag].QueryInterface(IID_IBasicAudio, pBasicAudio);
    pBasicAudio.put_Volume(0);
    end else
     begin
      FilterGraph.QueryInterface(IID_IBasicAudio, pBasicAudio);
      pBasicAudio.put_Volume(-10000);
      (Sender as TButton).Tag:= 0;
      FList.Items[(Sender as TButton).Tag].QueryInterface(IID_IBasicAudio, pBasicAudio);
      pBasicAudio.put_Volume(0);
      end;
 finally
   FList.Free;
 end;
end;
гляньте пжлст, вдруг поможет
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
ProDaNTe (10.12.2014)
  #10  
Старый 30.11.2014, 21:00
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

А это что TDSoundFilterList?
Кстати спасибо

Код:
procedure TForm1.GetSoundStreamsCount;

var EnumFilters: IEnumFilters; {The Variables needed for Filter Operations}
BaseFilter: IBaseFilter;
FilterInfo: TFilterInfo;
Klasse:TGuid;
begin
Form3.ListBox1.Clear;
glb_SoundStreams:=0; {plain }
(pGraphBuilder as IGraphBuilder).EnumFilters(EnumFilters); {Enumerate Filters}
While (EnumFilters.Next(1, BaseFilter, nil)=S_OK) do
begin
BaseFilter.QueryFilterInfo(FilterInfo);
BaseFilter.GetClassID(Klasse);
If (Klasse.D2=CLSID_DSoundRender.D2) and (Klasse.D3=CLSID_DSoundRender.D3) then {cool Sound Renderer Check}

begin
glb_SoundStreams:=glb_SoundStreams+1; {counting}
ItemAdd(Form3.ListBox1,Image3.MultiResBitmap.Items[0].Bitmap, 'customstyle1','Audio '+IntToStr(glb_SoundStreams),'');
if glb_SoundStreams=1 then Form3.ListBox1.ItemIndex:=0;
end;
end;
end;

Количество дорожек вроде определил)

Код:
function TForm1.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 TForm1.FindAudioSwith(const FG: IGraphBuilder): 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 (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 TForm1.SetAudioStream(AFilterGraph: IGraphBuilder;  i: Integer);
// Schaltet auf den angegebenen Kanal um
var
BF: IBaseFilter;
SS: IAMStreamSelect;
begin
BF := FindAudioSwith(AFilterGraph);
 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;     

А вот выбор все ни как не заработает(

Последний раз редактировалось ProDaNTe, 30.11.2014 в 21:05.
Ответить с цитированием
  #11  
Старый 30.11.2014, 21:04
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Это перечислитель графа фильтров - звенья цепочки, их и надо опрашивать на предмет кто с чем идёт
Ответить с цитированием
  #12  
Старый 30.11.2014, 21:05
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Понятно, а какой модуль нужен?
Ответить с цитированием
  #13  
Старый 30.11.2014, 21:09
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Обычный, DSub
Ответить с цитированием
  #14  
Старый 30.11.2014, 21:12
ProDaNTe ProDaNTe вне форума
Новичок
 
Регистрация: 25.12.2011
Сообщения: 75
Репутация: 10
По умолчанию

Что то не могу найти его даже в гугле(((
Кстати я не использую DSpack, просто DirectShow и использую FireMonkey)))

Последний раз редактировалось ProDaNTe, 30.11.2014 в 21:20.
Ответить с цитированием
  #15  
Старый 30.11.2014, 21:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

В смысле DShow (забыл)
Цитата:
...Кстати я не использую DSpack, просто DirectShow и использую FireMonkey)))
тогда извнт, я пас: это наработки 2008-го года для семёрки, a нового нет
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram