Ich versuche in einem Film zu suchen, indem ich die av_seek_frame-Methode von ffmpeg benutze, aber ich habe die größten Schwierigkeiten damit, zu bestimmen, wie man einen Zeitstempel erzeugt, um zu suchen. Angenommen, ich möchte die Anzahl der Bilder entweder vorwärts oder rückwärts suchen und weiß, in welchem Bild der Film gerade läuft, wie würde ich das machen?ffmpeg av_seek_frame
Antwort
Einfache Antwort: Sie sollten ein AVFormatContext-Objekt herumliegen haben. Seine duration
Eigenschaft sagt Ihnen, wie lange Ihre Datei in Bezug auf den Zeitstempel multipliziert mit 1000 ist, die in av_seek_frame verwendet werden kann, also behandeln Sie sie als 100%. Dann kannst du berechnen, wie weit du in das Video hineinsehen möchtest.
Wenn Sie einen Frame vorwärts gehen möchten, rufen Sie einfach av_read_frame und avcodec_decode_video auf, bis der Wert von got_picture_ptr mit einem Wert ungleich Null gefüllt ist. Stellen Sie vor dem Aufruf von avcodec_decode_video sicher, dass das Paket von av_read_frame aus dem Videostream stammt. avcodec_decode_video füllt dann die AVFrame-Struktur aus, mit der Sie alles machen können.
Hier ist, wie ich es tat:
// Duration of one frame in AV_TIME_BASE units
int64_t timeBase;
void open(const char* fpath){
...
timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE)/int64_t(pCodecCtx->time_base.den);
...
}
bool seek(int frameIndex){
if(!pFormatCtx)
return false;
int64_t seekTarget = int64_t(frameIndex) * timeBase;
if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0)
mexErrMsgTxt("av_seek_frame failed.");
}
Die AVSEEK_FLAG_ANY ermöglicht jedem Frame sucht und nicht nur Keyframes.
+1 für den Hinweis, was 'AVSEEK_FLAG_ANY' tut – puk
- 1. Problem: FFMPEG sucht mit av_seek_frame mit Byte-Positionen
- 2. Wie kann ich versuchen, Nr. X mit ffmpeg einzurahmen?
- 3. Powershell und FFMPEG - FFMPEG wird nicht ausgeführt
- 4. FFMPEG Videoschreiner
- 5. FFMPEG-Bibliothek in PPAPI verwenden: Naclports mit FFmpeg
- 6. ffmpeg für einen Android (mit Tutorial: "ffmpeg and Android.mk")
- 7. Handhabung der ffmpeg-Bibliotheksschnittstelle Änderung beim Aktualisieren von ffmpeg
- 8. FFMPEG Videokonvertierung für Pygame
- 9. ffmpeg nur Breite setzen
- 10. Beschleunigen FFmpeg Befehle
- 11. Build ffmpeg in ijkplayer
- 12. mit ffmpeg mit Xcode
- 13. ffmpeg: Video komprimieren?
- 14. FFMPEG GPU Bildverarbeitung
- 15. FFMPEG Sehr langsam
- 16. Langsame Videodrehung in FFMPEG
- 17. FFmpeg Eingang Ausgabe
- 18. ffmpeg Kompilieren für Android
- 19. FFMPEG Android-Bibliothek
- 20. Wma Dekodierung mit ffmpeg
- 21. FFMPEG und Pythons Subprozess
- 22. FFMPEG loop Video-Overlay
- 23. FFMPEG Video-Kodierungsfehler
- 24. Ffmpeg android bauen
- 25. FFmpeg concat - Quelldateien entfernen
- 26. FFMpeg - Hintergrundmusik hinzufügen
- 27. Android ffmpeg Bibliothek verwenden
- 28. Php ffmpeg erhalten Videodauer
- 29. FFMPEG-I/O-Ausgabepuffer
- 30. ffmpeg Codierung Probe gesucht?
Konnten Sie den Zeitversatz nicht mit der Bildrate berechnen? –
Von dem, was ich verstehe, muss der Zeitversatz in time_base-Einheiten sein, aber ich bin nicht genau sicher, wie man es in diese Einheiten umwandelt (oder sogar, wenn es das ist, was ich tun muss). Wenn das das ist, was ich tun muss, bin ich nicht sicher, was die Einheiten von time_base sind (Sekunden, Frames, Frames pro Sekunde). –