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_()ffdshow kann ich garnicht verwenden, da crasht das Programm einfach, welches den Codec verwendet.