![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как из AVI файла вытянуть второй поток звука. [D6, D7, Win95/98, Win2k, WinXP]
Rif © (2004-05-22 11:25:00)Есть авишка которая в себе содержит 2 звуковых потока (Eng\Rus)
уменя они воспризводятся одновременно, как перекрыть одид поток?
NailMan (2004-08-14 15:21:00) [1]Извини за задержку, только сейчас смог откопать пример:
Вот пример из моего VIDEO-движка плеера как я задаю общую громкость
при воспроизведении файла
Подразумевается что файл благополучно загружен и созданы(получены) все необходимые интерфейсы управления.
Массив значений громкости:
CONST VolumeTable : Array[0..16] of Integer = (-10000,-9000,-7500,-6500,-5500,
-4500,-4000,-3000,-2000,-1000,-750,-500,-250,-125,-100,-50,0);
Procedure TVideoEngine.SetVolume(vLevel : Integer);
begin
//предохраняемся если файл все-таки не загружен...
If plState=stclosed then exit;
//...или у него нет звуковой дорожки
if dsBasicAudio=nil then exit;
//так как у меня 16 градаций громкости, то проверяем на выход за границы дозволенного
If vLevel>16 then vLevel:=16;
//Если это файл не AVI или AVI но с одной дорожкой звука, то просто
//задаем ей громкость, иначе делаем множественное задание громкости
if (videotype<>avivideo) or (PlayMultiTrackMode=1) then
dsBasicAudio.put_Volume(VolumeTable[vLevel])
else
VIDEO.SetMultipleVolume(vLevel);
end;
Procedure TVideoEngine.SetMultipleVolume(vLevel:integer);
var
pEnum : IEnumFilters;
pFilter :IBaseFilter;
cFetched : dword;
CL:TGUID;
i:integer;
BA : IBasicAudio;
z : integer;
begin
i:=0;
repeat
//получаем энумератор фильтров в графе
dsGraphBuilder.EnumFilters(pEnum);
while pEnum.Next(1, pFilter, @cFetched) = S_OK do
begin
//если фильрт есть звуковой рендерер...
pFilter.GetClassID(CL);
if IsEqualGUID(CL,CLSID_DSoundRender) then
begin
//и рендерер не является мастер-трэком(текущим активным), то
//присваиаем мусорной переменной какое-то значение. В данном случае у меня каждая
//дорожка может иметь произвольное значение громкости
//иначе если это мастер-дорожка, то присваиваем новое значение громкости
If i<>CurrentPlayedAUDS then
z:=AUDSVolume[i]
else
z:=vLevel;
//получаем у нашего рендерера интерфейс которому можно применить новую громкость и применяем эту громкость
pFilter.QueryInterface(IID_IBasicAudio,BA);
BA.put_Volume(VolumeTable[z]);
//сохраняем на будущее это значение, так как изменяется громкость
//не-мастер дорожек в другом месте
AUDSVolume[i]:=z;
BA:=nil;
inc(i);
end;
pFilter:=nil;
end;
pFilter:=nil;
pEnum:=nil;
until dword(i)=avi.audstreams;
end;
Вобщем пример избыточен, задаешь массиву AUDSVolume(array of integer) нулевые значения и применяешь вышеприведенную процедуру SetVolume.
Главное нужно иметь значение в переменной CurrentPlayedAUDS, которая есть номер мастер-дорожки(та которая играет в текущий момент) и знать естественно число аудиодорожек.
---
WBR, NailMan aka 2:5020/3337.13
Rif (2004-08-12 07:50:00) [2]Вот вот хотя бы пока приглушить, тока как определить что глушить.
если можно то небольшой пример.
NailMan (2004-08-09 16:48:00) [3]Во первых чем проигрываешь файло?
Если пользуешь DirectShow, то все делается без проблем: глушится(Volume избранного в ноль) любой из них. Если надо мог кинуть пример.
Если не DirectShow - тады нынаю.
Если физически надо вырезать звук - ну тогда без fileread/filewrite и знания AVI-RIFF не обойтись.
---
WBR, NailMan aka 2:5020/3337.13
Кириешки (2004-08-07 12:42:00) [4]>Fantom (06.08.04 04:23) [3]
Тут типа левые теги не работают. Надпись под окном "Написать ответ" читал?
Fantom (2004-08-06 04:23:00) [5]<a href="">afa</a>
Rif (2004-05-26 07:59:00) [6]Я имел ввиду програмно на Delphi.
Jel (2004-05-22 15:09:00) [7]http://www.morgan-multimedia.com/mmswitch/