Chyba znalazłem pewien sposób. Jednak i tak potrzebuje pomocy kogoś bardziej doświadczonego. Wykorzystam do odtwarzania klipu wszystkie filtry directshow jakie będa potrzebne.
Klip źródłowy jednak bede chciał zbudować z pojedynczych klatek bmp. Znalazłem do tego
odpowiedni filtr w sieci. Nie moge sobie z nim jednak poradzic. Wydaje mi sie ze dobrze przetlumaczylem z c++ do delphi niewielka czesc kodu a jednak nie działa.
Filtr znajduje sie pod adresem: http://whorld.org/temp/BmpToAvi.html
Moje wypociny umieszczam poniżej.
Najpierw deklaracje, potem kilka linijek tworzenia filtrów w grafie i po uruchomieniu pokazuje mi ze nie dodano klatki do avi. Parametry klatki niby ustawia tzn nie pokazuje bledu ale jak potem otwieram graf to i tak filtr ma ustawiona wielkosc bmp 320x240
const
CLSID_BmpToAvi: TGUID = (D1:$ceab8f27;D2:$1f47;D3:$4e61;D4:($bb,$0a,$3f,$3a,$d3,$86,$c2,$b4));
IID_IBmpToAvi: TGUID = (D1:$85858221;D2:$3a64;D3:$4d0a;D4:($9a,$df,$2f,$89,$5d,$62,$4d,$a3));
type
TBMPTOAVI_PARMS = record
Width: integer; // frame width, in pixels
Height: integer; // frame height, in pixels
BitCount: integer; // number of bits per pixel
FrameRate: double; // frame rate, in frames per second
end;
IBmpToAvi = interface(IUnknown)
['{85858221-3A64-4d0a-9ADF-2F895D624DA3}']
function SetParms(var Parms: TBMPTOAVI_PARMS): HResult; stdcall;
function AddFrame(var Bitmap: HBITMAP): HResult; stdcall;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
MyGraphBuilder: igraphbuilder;
source,Renderer: ibasefilter;
parms: TBMPTOAVI_PARMS;
BmpToAVI: IBmpToAVI;
hDIB: HBitmap;
SourceOut,SmartTeeIn,RendererIn,SmartTeePreview,Pin: IPin;
EnumPins: IEnumPins;
begin
CoInitialize(nil);
hrr := CoCreateInstance (CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, MyGraphBuilder);
if hrr <> S_OK then
begin
MessageDlg('Nie wykreowano mygraphbuilder.', mtInformation,[mbOk], 0);
Exit;
end;
hrr := CoCreateInstance(CLSID_BmpToAvi,nil,CLSCTX_INPROC_SERVER,IID_IBaseFilter,Source);
if hrr <> S_OK then
begin
MessageDlg('Nie wykreowano BmpToAvi.', mtInformation,[mbOk], 0);
Exit;
end;
MyGraphBuilder.AddFilter(Source,'Bmp To AVI');
hrr := CoCreateInstance(CLSID_VideoRenderer,nil,CLSCTX_INPROC_SERVER,IID_IBaseFilter,Renderer);
if hrr <> S_OK then
begin
MessageDlg('Nie wykreowano Renderer.', mtInformation,[mbOk], 0);
Exit;
end;
MyGraphBuilder.AddFilter(Renderer,'Video Renderer');
hrr := GetPin(Renderer,PINDIR_INPUT,RendererIn);
if hrr <> S_OK then
begin
MessageDlg('Nie znaleziono pinu RendererIn.', mtInformation,[mbOk], 0);
Exit;
end;
hrr := GetPin(Source,PINDIR_OUTPUT,SourceOut);
if hrr <> S_OK then
begin
MessageDlg('Nie znaleziono pinu SourceOut.', mtInformation,[mbOk], 0);
Exit;
end;
hrr := MyGraphBuilder.Connect(SourceOut,RendererIn);
if hrr <> S_OK then
begin
MessageDlg('Nie połączono pinu SourceOut i RendererIn.', mtInformation,[mbOk], 0);
Exit;
end;
hrr := Source.QueryInterface(IID_IBmpToAvi,BmpToAVI);
if hrr <> S_OK then
begin
MessageDlg('Nie wykonano QueryInterface na BmpToAvi.', mtInformation,[mbOk], 0);
Exit;
end;
parms.Width := 720;
parms.Height := 576;
parms.BitCount := 32;
parms.FrameRate := 25;
hrr := BmpToAVI.SetParms(parms);
if hrr <> S_OK then
begin
MessageDlg('Nie ustawiono parametrów BmpToAVI.', mtInformation,[mbOk], 0);
Exit;
end;
Image1.Picture.LoadFromFile('C:\Roboczy\Test.bmp');
hDIB := Image1.Picture.Bitmap.Handle;
hrr := BmpToAVI.AddFrame(hDIB);
if hrr <> S_OK then
begin
MessageDlg('Nie dodano ramki do BmpToAVI.', mtInformation,[mbOk], 0);
Exit;
end;
savegraphfile(mygraphbuilder,'G:\Video\tvplayer.grf');
CoUnInitialize;
end;