procedure PlayFile(filename: String);
var
MemS: TBCMemFileStream;
//TBCMemFileStream - класс, описанный в файле UMemFile.pas примера MemFile из DSPack. Совместно с TBCMemFileReader реализует чтение данных из памяти.
FS: TFileStream;
MR: TBCMemFileReader;
pmt: PAMMediaType;
mt: TAMMediaType;
hres: HRESULT;
FG: IFilterGraph;
Bldr: IGraphBuilder;
Pin: IPin;
MCon: IMediaControl;
ME: IMediaEvent;
begin
filename:='E:\mpg.mpg';
FS:=TFileStream.Create(filename, fmOpenRead);
MemS:=TBCMemFileStream.Create(nil, fS.Size);
FS.Destroy;
pmt := @mt;
TBCMediaType(pmt).InitMediaType;
mt.majortype := MEDIATYPE_Stream;
mt.subtype:=GetMediaType(UpperCase(ExtractFileExt(filename)));
MR:=TBCMemFileReader.Create(MemS, pmt, hres);
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IFilterGraph, FG);
FG.AddFilter(MR, nil);
if FG.QueryInterface(IID_IGraphBuilder, Bldr)=0 then begin
Pin := MR.GetPin(0);
Bldr.Render(Pin); //если вместо этой строчки вставить _Builder.RenderFile(filename, nil); , всё прекрасно работает
end;
FG.QueryInterface(IID_IMediaEvent, ME);
if FG.QueryInterface(IID_IMediaControl, MCon)=0 then
MCon.Run;
end;
DirectShow+DSPack, Delphi (проигрывание видео из памяти)
В данный момент работаю над программой, одна из задач которой - проигрывание видео из памяти, не напрямую из файла с диска. Для реализации использую DirectShow и библиотеку DSPack. С файлами с расширением .mpg всё работает без проблем, а вот с .avi трудности: при многократном использовании, каждый раз после запуска алгоритма (он приведён ниже) число потоков моего процесса увеличивается на 1 и в конце-концов программа выдаёт ошибку. Не понимаю, в чём здесь дело?
Код: