Comment puis-je chercher à encadrer n ° X avec ffmpeg?
Je suis en train d'écrire un éditeur vidéoet j'ai besoin de chercher à l'image exacte, sachant que le numéro de l'image.
Autres postes sur stackoverflow me dit que ffmpeg peut me donner quelques cadres brisés après recherche, qui n'est pas un problème pour la lecture, mais un gros problème pour les éditeurs vidéo.
Et j'ai besoin de chercher par le numéro de l'imagepas par le temps, qui va devenir inexactes lors de la conversion au numéro de l'image.
J'ai lu dranger s tuts (qui est obsolète aujourd'hui), et à la fin avec l':
av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);
Il toujours chercher à l'image No. 0
et toujours return 0
ce qui signifie succès.
Alors j'ai essayé de lire Blender code source et de le trouvé vraiment complexe(peut-être que je devrait mettre en place un buffer d'image?).
Donc, est-il une manière simple de rechercher une image avec un simple appel comme seek(context, frame_number)
(tout en obtenant une image complète, pas cassé)? Ou, est-il un léger bibliothèque qui simplifie ce?
EDIT:
Grâce à praks411,j'ai trouvé la solution:
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:
S'avère qu'il y est une bibliothèque pour cela: FFMS2.
C'est "un FFmpeg en fonction de la source de la bibliothèque [...] pour faciliter l'image exacte de l'accès", et est portable (au moins sur Windows et Linux).
source d'informationauteur Giumo | 2013-07-09
Vous devez vous connecter pour publier un commentaire.
av_seek_frame
cherche uniquement basées sur l'horodatage de l'image clé. Depuis, il cherche à l'image-clé, vous ne pouvez pas obtenir ce que vous voulez. Par conséquent, il est recommandé de rechercher sur le plus proche de l'image clé, puis lire image par image util vous atteignez l'image souhaitée.Toutefois, si vous traitez avec l'fixe la valeur de FPS, alors vous pouvez facilement la carte d'horodatage à l'image d'index.
Avant de chercher à obtenir, vous devrez convertir votre temps à
AVStream.time_base
unités si vous avez des flux de données spécifié. Lire ffmpeg documentation deav_seek_frame
dansavformat.h
.Par exemple, si vous voulez chercher à
1.23
secondes de clip: