Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2010, 15:24   #1
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию DS Pack - audiostream

Здравствуйте.
Ребята, может кто подскажет как в плеере построенном на DSPack можно получить количество звуковых дорожек в avi файле (по моему avi[mux]) и в процессе роботы их переключать.
nXs вне форума Ответить с цитированием
Старый 04.03.2010, 15:54   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...копайте в сторону интерфейса IAMStreamSelect ...хотя еще есть вариант получать IBasicAudio для каждого и "по-извращенски" управлять их громкостью/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.03.2010, 17:15   #3
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

А можно ли где то накопать простенький исходник (чтобы понять принцип работы). Нашел пример, но там, извините, черт ногу сломит...
nXs вне форума Ответить с цитированием
Старый 04.03.2010, 17:19   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...выкладывайте пример.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.03.2010, 17:31   #5
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

Код:
function TForm7.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 TForm7.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 TForm7.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;
С сайта http://www.progdigy.com/
Человек пишет (вроде ) что аудио дорожки находит но не переключает.
nXs вне форума Ответить с цитированием
Старый 04.03.2010, 17:33   #6
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

И еще вот кусок кода который (как я понял) если дорожек больше чем одна, выбирает самую первую. Но как мне вывести список дорожек (с возможностью последующего выбора)б и как это все привязать к filtergraph?
Код:
         If dsTempFilter.QueryInterface(IID_IAMStreamSelect, dsStreamSelect) = S_OK then
         Begin
           // Reset to first stream if there is more than one stream
           If dsStreamSelect.Count(DWord(I)) = S_OK then
             If I > 1 then dsStreamSelect.Enable(0,AMSTREAMSELECTENABLE_ENABLE);
           dsStreamSelect := nil;
         End;
nXs вне форума Ответить с цитированием
Старый 04.03.2010, 20:02   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...при построении графа фильтров вы присоединяете IAMStreamSelect к графу... дальше все достаточно просто:
Код:
VAR SS: IAMStreamSelect;
    I: integer;
begin
  if OpenDialog.Execute then
  begin
    if not FilterGraph.Active then FilterGraph.Active := true;
    FilterGraph.ClearGraph;
    FilterGraph.RenderFile(OpenDialog.FileName);
    VideoWindow.PopupMenu := PopupMenu;
    SoundLevel.Position := FilterGraph.Volume;


    If FilterGraph.QueryInterface(IID_IAMStreamSelect, SS) = S_OK then
         Begin
           // Reset to first stream if there is more than one stream
           If SS.Count(DWord(I)) = S_OK then
             If I > 1 then SS.Enable(0,AMSTREAMSELECTENABLE_ENABLE);
           SS:= nil;
         End;
    caption:= inttostr(i); // кол-во дорожек
    //
    SetAudioStream(FilterGraph, 0); // возможность переключить в реале
    //
    FilterGraph.Play;
  end;
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.03.2010, 10:33   #8
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

Да, но мне возвращает количество дорожек 0 (хотя заранее известно что в этом файле 2 дорожки), и ругается на то что [Error](48): Undeclared identifier: 'SetAudioStream' (я так понял не подключен какой то модуль, но какой?).
nXs вне форума Ответить с цитированием
Старый 05.03.2010, 11:15   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...проверил, возвращает на некоторых "0", на других "2"... буду смотреть чем эти контейнеры отличаются.
Цитата:
[Error](48): Undeclared identifier: 'SetAudioStream'
почему-же у меня-то не ругается? аж...странно, что я делаю не так


upd
-------

...один "матросской" открыл, другой virtualdubmod не берет, щось нахимичено.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 05.03.2010 в 12:04.
raxp вне форума Ответить с цитированием
Старый 07.03.2010, 16:46   #10
nXs
Форумчанин
 
Регистрация: 26.02.2010
Сообщений: 126
По умолчанию

Вот таким макаром получил корректное количество аудиодорожек (правда при открытии первого файла, ):
Код:
procedure GetSoundStreamsCount;

var EnumFilters: IEnumFilters; {The Variables needed for Filter Operations}
BaseFilter: IBaseFilter;
FilterInfo: TFilterInfo;
Klasse:TGuid;
begin
Form1.glb_SoundStreams:=0; {plain }
(Form1.FilterGraph as IFilterGraph).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
Form1.glb_SoundStreams:=Form1.glb_SoundStreams+1; {counting}
Form1.ComboBox1.Items.Add('Audio '+IntToStr(Form1.glb_SoundStreams)); {Output}
if Form1.glb_SoundStreams=1 then Form1.ComboBox1.ItemIndex:=0;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
if not Opendialog1.execute then exit;
FilterGraph.Active:= true;
FilterGraph.ClearGraph; // <-- добавляем и открываем сколько угодно
FilterGraph.RenderFile(OpenDialog1.FileName);
GetSoundStreamsCount;

end;
Upd: нашел ошибку, .

Последний раз редактировалось nXs; 07.03.2010 в 16:53.
nXs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
k-lite codec pack Brakus Помощь студентам 1 06.02.2010 04:10
Windows 2000 Service Pack 1 Иван Ришко Windows 5 20.06.2009 12:49
TMS Component Pack Gromsky Общие вопросы C/C++ 0 16.04.2009 15:23
MediaPlayer и кодеки вроде K-Lite codec pack, xp codec pack Rend1 Мультимедиа в Delphi 2 03.02.2008 20:17
MSXML 4.0 Service Pack 2 Nevil Общие вопросы Delphi 1 16.09.2007 18:15