Mahlzeit!
Ich nutze den DirectShow MediaDetector um an die Frames von AVIs zu kommen.
Nun gibts da ein Problem, das die Funktion
IMediaDet::GetBitmapBits nur zu Beginn des Videos das richtige Frame liefert, dann weicht es 1-2 Frames, bei langen Videos schonmal 2 oder mehr ab.
An die Infos kommt man so ran:
Delphi-Quellcode:
var StreamLength:Double;
FFrameRate:Double;
FFrames:Integer;
// StreamLength
If not Succeeded(MediaDet.get_StreamLength(StreamLength))
then
Raise Exception(EStreamError);
// FrameRate
MediaDet.get_FrameRate(FFrameRate);
FFrames:=Round(StreamLength * FFrameRate);
Interessant ist, das StreamLength (fast) bei allen Videos etwas zu lang ist und meist ein par Frames dazu gedichtet werden und dabei eine Kommastelle

raus kommt.
Beispiel:
FPS: 25.0
Frames: 13475
Länge: 8:59.00
DS zeigt an:
FrameRate: 25.0
Frames (gerundet): 13477
Frames: 13477,000000000001
StreamLength: 539,080000000000041
Das Bild holt man so:
Delphi-Quellcode:
StreamPos:=Frame / FFrameRate;
If not Succeeded(MediaDet.GetBitmapBits(StreamPos, @BufSize, nil, FWidth, FHeight)) then ...
So, nun würd ich gerne wissen, wie sich der Bug umgehen läßt
Grüße, Sun