Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизПодскажите как из AVI файла вытянуть второй поток звука. Найти похожие ветки
← →
Rif (2004-05-22 11:25) [0]Есть авишка которая в себе содержит 2 звуковых потока (Eng\Rus)
уменя они воспризводятся одновременно, как перекрыть одид поток?
← →
Jel © (2004-05-22 15:09) [1]http://www.morgan-multimedia.com/mmswitch/
← →
Rif (2004-05-26 07:59) [2]Я имел ввиду програмно на Delphi.
← →
Fantom (2004-08-06 04:23) [3]<a href="">afa</a>
← →
Кириешки © (2004-08-07 12:42) [4]>Fantom (06.08.04 04:23) [3]
Тут типа левые теги не работают. Надпись под окном "Написать ответ" читал?
← →
NailMan © (2004-08-09 16:48) [5]Во первых чем проигрываешь файло?
Если пользуешь DirectShow, то все делается без проблем: глушится(Volume избранного в ноль) любой из них. Если надо мог кинуть пример.
Если не DirectShow - тады нынаю.
Если физически надо вырезать звук - ну тогда без fileread/filewrite и знания AVI-RIFF не обойтись.
---
WBR, NailMan aka 2:5020/3337.13
← →
Rif (2004-08-12 07:50) [6]Вот вот хотя бы пока приглушить, тока как определить что глушить.
если можно то небольшой пример.
← →
NailMan © (2004-08-14 15:21) [7]Извини за задержку, только сейчас смог откопать пример:
Вот пример из моего 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
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c