Frage

Ich versuche zu verstehen, wie man in Videos sucht, die mit P-Frames codiert sind (z. B.H.264) – im Moment weiß ich nur, wie man in Videos sucht, die mit Codecs codiert sind, in denen jedes Bild ein Schlüsselbild ist (z. B.MJPEG).

Bei gegebenem Zeitstempel sollte letztendlich der Frame für diesen Zeitstempel abgespielt werden. Aber im Moment versuche ich nur, den Keyframe in der Nähe des Zeitstempels abzuspielen. So zuerst--

ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0); 
avcodec_flush_buffers(pCodecCtx);

Dann etwas dazwischenliegender Code, einschließlich av_read_frame.Dann--

ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet); 

Beobachtungen:

  • Bei einigen Videos funktioniert das.Für andere, avcodec_decode_video2 gibt einen Fehler zurück (negative Zahl).Beispiel für ein funktionierendes Video: Hier.Beispiel für ein nicht funktionierendes Video: Hier.

  • Bei MJPEG-Videos funktioniert dies.

  • Wenn ich das rausnehme av_seek_frame, so dass die Frames einfach der Reihe nach abgespielt werden, funktioniert es.

War es hilfreich?

Lösung

Ersetzen Sie dies--

ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0); 
avcodec_flush_buffers(pCodecCtx);

mit diesem--

ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0); 

(Vorbehalt:Die Dokumente für avformat_seek_file sagen:„Dies ist Teil der neuen Such-API, die sich noch im Aufbau befindet.Benutzen Sie dies daher noch nicht.Es kann sich jederzeit ändern, erwarten Sie noch keine ABI-Kompatibilität!)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top