Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface aus Pointer oder: AVIs einlesen (https://www.delphipraxis.net/87143-interface-aus-pointer-oder-avis-einlesen.html)

DGL-luke 23. Feb 2007 22:36


Interface aus Pointer oder: AVIs einlesen
 
Hallo,

ich mach hier gerade fremden Code flott... Ich hab mir von torry.net Compressed AVI Read/Write Units geladen.

Und da passiert folgendes:

Delphi-Quellcode:
//definitionen
pavis: PAVIStream = Pointer;

IAVIStream = interface(IUnknown)
 ...
end;

function AVIStreamEnd(pavi: IAVISTREAM): LONG;


Ending:=AVIStreamENd(pavis); //hier knallts
Ich habe den aufruf mal durch das hier ersetzt:

Delphi-Quellcode:
Ending:=AVIStreamEnd(IAVIStream(pavis^));
Und habe jetzt folgenden Code:

Delphi-Quellcode:
procedure TForm2.BOpenAVIClick(Sender: TObject);
begin
  with TOpenDialog.Create(nil) do
  try
    Filter := 'Audio/Video Interlaced File (*.avi)|*.avi';
    if Execute then
    begin
      MainAVI.Start := 0;
      MainAVI.Ending := 1;
      MainAVI.Open(FIleName);
    end;
  finally
    Free;
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  GetMem(Buffer, 1024); //nur mal auf Verdacht alloziiert, wegen der AV, ändert aber nix - Buffer: Pointer, als Form-Member deklariert.
  MainAVI := TAVIReader.Create(Buffer);
end;
Was allerdings sehr merkwürdig ist:

Delphi-Quellcode:
function TAVIReader.Open(AFileName: String): integer;
begin
  FileName := AFileName;
  result := AVIFileOpen(pavi, Pchar(Filename), OF_READ, nil);
  AVIFILEGetStream(pavi,pavis,streamtypeVIDEO,0); //hier
  Start:=AVIStreamStart(pavis);
  Ending:=AVIStreamEnd(IAVIStream(pavis^));
  ob:=AVIStreamGetFrameOpen(pavis,nil);
  AVIStreamBeginStreaming(pavis,Start,Ending,1000);
//  DrawDIBStart(han,microsperframe); //nicht von mir auskommentiert
end;
Wenn ich diese Funktion durchsteppe (Ich hab extra schon die optimierung ausgeschaltet), zeigt er mir, wenn ich bei "//hier" bin und auf "Eins weiter" klicke, das "end;" als nächste Anweisung - er überspringt mir also 4 Programmzeilen...

Das ganze kracht dann mit einer Read bei 0 AV in "AVIFil32.dll" (eine Systemdll, glaub ich, das PSDK gibt mir auch Auskunft über die Funktionen, die exportiert werden), nach kompletten durchsteppen (also nach dem end meines Buttonclickhandlers)

Also:

1. kann mir wer helfen
2. hat jemand ne andere freie AVI-Read/Write-Kompo da?

xaromz 23. Feb 2007 23:52

Re: Interface aus Pointer oder: AVIs einlesen
 
Hallo,

Zitat:

Zitat von DGL-luke
Was allerdings sehr merkwürdig ist:

...

Wenn ich diese Funktion durchsteppe (Ich hab extra schon die optimierung ausgeschaltet), zeigt er mir, wenn ich bei "//hier" bin und auf "Eins weiter" klicke, das "end;" als nächste Anweisung - er überspringt mir also 4 Programmzeilen...

Das heißt, dass in dieser Zeile eine Exception ausgelöst wurde, die der Debugger nicht genauer anzeigen kann (steckt ja in einer DLL), deshalb springt er direkt zu end;.
Zitat:

Zitat von DGL-luke
1. kann mir wer helfen
2. hat jemand ne andere freie AVI-Read/Write-Kompo da?

Was hast Du denn vor? Diese Komponente ist ja auch schon vier Jahre alt und zeitgemäß ist VFW sicher nicht mehr (Stichwort DirectShow).

Gruß
xaromz

DGL-luke 24. Feb 2007 11:07

Re: Interface aus Pointer oder: AVIs einlesen
 
Aha... so ist das zu erklären.

Was ich will:

- aus mehreren AVIs die einzelnen Frames extrahieren
- diese Frames manipulieren
- ein neues AVI mit meinen manipulierten Frames und dem Audiotrack aus dem ersten AVI speichern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz