DirectShow: CopyCaptureFile will nur bei manchen Dateien.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

DirectShow: CopyCaptureFile will nur bei manchen Dateien.

Beitrag von DarkDragon »

Hallo,

Ich versuche mit ICaptureGraphBuilder2::CopyCaptureFile in meinem Programm den gültigen Inhalt einer AVI Datei zu kopieren. Wenn man vor hat etwas eine längere Zeit aufzunehmen, dann reserviert man eine große, unfragmentierte Datei auf der Festplatte, damit es nicht wegen der Fragmentierung zu Rucklern kommt und nimmt erstmal in diese Datei auf. Danach kopiert man den gültigen Inhalt der Datei in eine andere Datei. So und hier ist nun mein Problem: nicht mit allen Codecs kopiert diese Funktion die AVI Datei in voller Länge in eine andere.

Ich habe hier zum Beispiel eine AVI Datei mit XVid und MPEG-Layer 3 aufgenommen:
http://www.bradan.eu/files/testavi.zip

Mit dem Quelltext müsste sich das Video so duplizieren lassen, dass es denselben Inhalt hat, aber in der Dateigröße kleiner ist.

Code: Alles auswählen

Interface ICaptureGraphBuilder22
  QueryInterface(a.l, b.l)
  AddRef()
  Release()
  SetFiltergraph(a.l)
  GetFiltergraph(a.l)
  SetOutputFileName(a.l, b.l, c.l, d.l)
  FindInterface(a.l, b.l, c.l, d.l, e.l)
  RenderStream(a.l, b.l, c.l, d.l, e.l)
  ControlStream(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
  AllocCapFile(a.l, b.q)
  CopyCaptureFile(a.p-unicode, b.p-unicode, c.l, d.l)
  FindPin(a.l, b.l, c.l, d.l, e.l, f.l, g.l)
EndInterface

Macro DEFINE_GUID(Name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
  Global Name.GUID
  
  Name\Data1    = l
  Name\Data2    = w1
  Name\Data3    = w2
  Name\Data4[0] = b1
  Name\Data4[1] = b2
  Name\Data4[2] = b3
  Name\Data4[3] = b4
  Name\Data4[4] = b5
  Name\Data4[5] = b6
  Name\Data4[6] = b7
  Name\Data4[7] = b8
EndMacro

#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10

#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER | #CLSCTX_INPROC_HANDLER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER | #CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER

DEFINE_GUID(IID_ICaptureGraphBuilder2, $93e5a4e0, $2d50, $11d2, $ab, $fa, $00, $a0, $c9, $c6, $e3, $8d);
DEFINE_GUID(CLSID_CaptureGraphBuilder2,$BF87B6E1, $8C27, $11d0, $B3, $F0, $0, $AA, $00, $37, $61, $C5)

Define *CaptureGraphBuilder.ICaptureGraphBuilder22
Define Source.s
Define Target.s

MessageRequester("Information", "This program will copy the valid content of one avi file into another one." + #LF$ + "First you must choose the source avi file, then the target file.")

Source = OpenFileRequester("Source AVI file", "temp.avi", "*.avi", 0)
Target = SaveFileRequester("Target AVI file", "target.avi", "*.avi", 0)

CoInitialize_(0)

If CoCreateInstance_(@CLSID_CaptureGraphBuilder2, 0, #CLSCTX_INPROC, @IID_ICaptureGraphBuilder2, @*CaptureGraphBuilder) = #S_OK
  *CaptureGraphBuilder\CopyCaptureFile(Source, Target, #False, #Null)
  *CaptureGraphBuilder\Release()
EndIf

CoUninitialize_()
Man braucht keinen normalen GraphBuilder um diese Funktion auszuführen, denn AMCap macht es genauso und mit manchen Codecs funktioniert es ja auch mit diesem Quelltext. Nur was mach ich falsch?

ffdshow kann ich garnicht verwenden, da crasht das Programm einfach, welches den Codec verwendet.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: DirectShow: CopyCaptureFile will nur bei manchen Dateien

Beitrag von DarkDragon »

Also ich hab mich heute entschlossen dieses Thema auch im MSDN Forum anzureißen und da gab man mir den Hinweis, dass die Länge der AVI Datei direkt nach dem ersten fourCC steht in einem 32bit Integer. Aber was wenn das Video größer als 4GB ist?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten