2009-06-15 11 views
2

Aufgabe: Ergreifen beliebiger Bilder aus MPEG2-Videodateien. Jetzt benutze ich benutzerdefinierte Render-Filter zum Greifen, aber Problem mit der Positionierung Video auf erforderlichen Rahmen.SetPosition erhalten falsches Ergebnis

Ich benutze SetPosition(), nach Pause() für die Übergabe von Frames durch Graph, warten auf Filter empfangen ersten Frame und Stop().

Wenn ich Frame für Frame bekomme, empfange ich zuerst genau für diesen Zeitraum, nach diesem Frame einige Male wiederholen, und wieder genaues Frame.

Warum SetPosition falsches Ergebnis erhalten?

+0

Gibt es hier eine Frage? –

+0

Was versuchen Sie zu erreichen? Bestimmte Frames erhalten oder das ganze Video aufnehmen? –

+0

bestimmte Rahmen erhalten – Fanruten

Antwort

3

Der Decoder muss mit dem vorherigen i-Frame beginnen. Normalerweise beginnt der Demux, Daten mindestens eine Sekunde davor zu schieben. Wenn Sie mit dem Empfang von Frames beginnen, sollten Sie den Zeitstempel überprüfen, um zu sehen, ob sie der gewünschte sind. Ihr Filter erhält einen "NewSegment" -Aufruf, der die Suchstartposition in der Datei angibt. Wenn Sie diese Startzeit zu der Abtastzeit im Rahmen hinzufügen, erhalten Sie die absolute Position des Rahmens innerhalb der Datei, und Sie können diese mit Ihrem gewünschten Standort vergleichen.

G

+0

Ich füge Startzeit zur Abtastzeit hinzu. Die absolute Position ist bei ~ 0,5 Sekunden, die ich mit SetPosition eingestellt habe, gratloser. – Fanruten

+0

klingt nach rechts. Das ist der Anfang der GOP. Mach weiter, bis du zu dem Frame kommst, den du willst. –

0

Sie müssen die Grafik pausieren, nachdem Sie das Diagramm verdient gemacht haben. Danach können Sie den gewünschten Frame mit SetPositions ändern.

Etwas wie folgt aus:

int ShowFrame(long lFrame) 
{ 
    if (FAILED(m_pMC->Pause())) 
     return -1; 
    LONGLONG llUnknown = 0; 
    LONGLONG llTime = LONGLONG(m_lFrameTime) * lFrame + m_lFrameTime/2; 
    GUID TimeFormat; 
    if (FAILED(m_pMS->GetTimeFormat(&TimeFormat))) return -1; 
    if (TimeFormat == TIME_FORMAT_MEDIA_TIME) 
    { 
     llUnknown = llTime; 
    } 
    else 
    { 
     if (FAILED(m_pMS->ConvertTimeFormat(&llUnknown, &TimeFormat, llTime, &TIME_FORMAT_MEDIA_TIME))) return -1; 
    } 
    if (FAILED(m_pMS->SetPositions(&llUnknown, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning))) return -1; 
    return 0; 
} 

m_lFrameTime ist die Zeit für einen Rahmen, können Sie in Ihrem benutzerdefinierten Renderer erhalten. Wenn der Video-Renderer-Pin verbunden ist, können Sie den VIDEOINFO :: AvgTimePerFrame an diesem Pin abrufen.