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).