|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
DirectShow сменить аудиодорожку
Использую DirectShow9, как поменять аудиодорожку и вкл-выкл субтитры, в сети поиск результатов внятных не дал(((
hr := pGraphBuilder.QueryInterface(IBasicAudio, pBasicAudio); В pBasicAudio чего то не вижу то что надо( Пожалуйста помогите)))) Где именно она там выбирается IAudioMediaStream? Последний раз редактировалось ProDaNTe, 28.11.2014 в 22:16. |
#2
|
||||
|
||||
Насчёт субтитров - а у вас в системе для их отображения внешний VSFilter установлен или что-то другое используется?
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Alegun, да именно DirectVobSub установлен как я понял через него и идет показ субтитров, но с субтитрами ещё можно смерится, а вот со звуковой дорожкой надо что то делать(
|
#4
|
||||
|
||||
Это новое название фильтра такое, субтитры отключаются в нём, управление можно осуществить через иконку в трее. Насколько мне известно, мелкомяконький медиаплеер дорожки переключать не умеет, они воспроизводятся все вместе, и их можно лишь приглушить микшером
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
Прости не понял тебя, при чем здесь "мелкомяконький медиаплеер" - ведь я использую DirectShow
|
#6
|
||||
|
||||
Оффтоп:
Цитата:
По теме: У вас зато ведь есть pBasicAudio.put_Volume, им и глушите (переключайте) выходы у рендереров З.Ы. Кстати, есть ещё IAMStreamSelect У него правда такой расклад - пин на выходе сплиттера, один рендерер его играющий но несколько звуковых потоков, выбирающихся этим интерфейсом внутри сплиттера, возможно даже крутящих звук одновременно и это нужно учитывать Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Так в этом и проблема как узнать количество дорожек и приглушить именно ту самую, спасибо за IAMStreamSelect - покопаю в эту сторону пока
|
#8
|
|||
|
|||
Код:
pStreamSelect : IAMStreamSelect hr := pGraphBuilder.QueryInterface(IID_IAMStreamSelect, pStreamSelect); if hr<>0 then begin ShowMessage('Не удается получить интерфейс управления аудиодорожками'); exit; end; Чёт инициализировать не могу( |
#9
|
||||
|
||||
Вот откопал рабочий переключатель из заброшенного видеоплеера
Код:
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
|
|||
|
|||
А это что 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
|
||||
|
||||
Это перечислитель графа фильтров - звенья цепочки, их и надо опрашивать на предмет кто с чем идёт
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#12
|
|||
|
|||
Понятно, а какой модуль нужен?
|
#13
|
||||
|
||||
Обычный, DSub
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#14
|
|||
|
|||
Что то не могу найти его даже в гугле(((
Кстати я не использую DSpack, просто DirectShow и использую FireMonkey))) Последний раз редактировалось ProDaNTe, 30.11.2014 в 21:20. |
#15
|
||||
|
||||
В смысле DShow (забыл)
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |