Como posso procurar enquadrar o nº X com o ffmpeg?

Estou escrevendo umeditor de vídeo, e eu preciso procurar a estrutura exata, conhecendo onúmero do quadro.

Outros posts no stackoverflow me disseram que o ffmpeg pode me dar alguns frames quebrados depois de procurar, o que não é um problema para a reprodução, mas um grande problema para os editores de vídeo.

E eu preciso procurarpelo número do quadro, não pelo tempo, que se tornará impreciso quando convertido para o número do quadro.

Eu já li tuts do dranger (que está desatualizado agora) e acabam com:

av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);

Sempre procura enquadrarNo. 0, e semprereturn 0 o que significa sucesso. Então eu tentei ler o código fonte do Blender e achei muito complexo (talvez eu devesse implementar um buffer de imagem?).

Então, existe alguma maneira simples de procurar um quadro com apenas uma chamada simples comoseek(context, frame_number)(enquanto recebendo um quadro completo, não um quebrado)? Ou existe alguma biblioteca leve que simplifique isso?

EDITAR: Graças apraks411, Encontrei a solução:

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: Acontece que há uma biblioteca para isso:FFMS2. É "uma biblioteca de fontes [...] baseada no FFmpeg para um acesso preciso e de quadro fácil", e é portátil (pelo menos em Windows e Linux).

questionAnswers(1)

yourAnswerToTheQuestion