Wie kann ich versuchen, Nr. X mit ffmpeg zu rahmen?

Ich schreibe eineVideobearbeiter, und ich muss versuchen, den genauen Rahmen zu kennen, dieRahmennummer.

Andere Posts auf stackoverflow haben mir mitgeteilt, dass ffmpeg nach der Suche möglicherweise ein paar kaputte Frames anzeigt, was kein Problem für die Wiedergabe, sondern ein großes Problem für Video-Editoren darstellt.

Und ich muss suchennach Bildnummer, nicht mit der Zeit, die ungenau wird, wenn sie in die Bildnummer konvertiert wird.

Ich habe die Tuts von Dranger gelesen (die jetzt veraltet sind) und erhalte am Ende:

av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);

Es wird immer versucht, einen Rahmen zu bildenNo. 0, und immerreturn 0 Das bedeutet Erfolg. Dann habe ich versucht, Blenders Quellcode zu lesen und fand ihn sehr komplex (sollte ich vielleicht einen Bildpuffer implementieren?).

Also, gibt es eine einfache Möglichkeit, mit nur einem einfachen Aufruf wie zu einem Frame zu suchenseek(context, frame_number)(während man einen vollen Rahmen bekommt, keinen kaputten)? Oder gibt es eine schlanke Bibliothek, die dies vereinfacht?

BEARBEITEN: Dank anpraks411, Ich habe die Lösung gefunden:

void AV_seek(AV * av, size_t frame)
{
    int frame_delta = frame - av->frame_id;
    if (frame_delta < 0 || frame_delta > 5)
        av_seek_frame(av->fmt_ctx, av->video_stream_id,
                frame, AVSEEK_FLAG_BACKWARD);
    while (av->frame_id != frame)
        AV_read_frame(av);
}

void AV_read_frame(AV * av)
{
    AVPacket packet;
    int frame_done;

    while (av_read_frame(av->fmt_ctx, &packet) >= 0) {
        if (packet.stream_index == av->video_stream_id) {
            avcodec_decode_video2(av->codec_ctx, av->frame, &frame_done, &packet);
            if (frame_done) {
                ...
                av->frame_id = packet.dts;
                av_free_packet(&packet);
                return;
            }
        }
        av_free_packet(&packet);
    }
}

EDIT2: Es stellte sich heraus, dass es dafür eine Bibliothek gibt:FFMS2. Es handelt sich um eine [...] FFmpeg-basierte Quellbibliothek für den einfachen [...] rahmengenauen Zugriff und ist portabel (zumindest für Windows und Linux).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage