Recherche précise avec ffmpeg

Disons que j’ai un fichier audio en cours de décodage avec ffmpeg . Le format source est quelque chose comme AAC où l’audio est divisé en paquets. Lorsque vous recherchez une heure donnée, il est clair que l’heure ne tombera pas, la plupart du temps, sur la frontière du paquet, mais quelque part dans la durée du paquet. Dois-je chercher dans le paquet moi-même ou av_seek_frame le fait tout seul et configure le décodage de sorte que la trame décodée suivante commence à la position que j’ai demandée?

Si j’utilise la fonction av_seek_frame avec l’indicateur AVSEEK_FLAG_BACKWARD , je suppose que le prochain paquet renvoyé par av_read_frame sera le paquet contenant la position temporelle que je recherche. Est-ce correct?

Si je décode ce paquet avec avcodec_decode_audio4 , la trame renvoyée contiendra-t-elle les données audio au début du paquet ou à partir du moment où je suis passé à av_seek_frame ? Dans ce dernier cas, comment puis-je connaître l’horodatage trame / paquet afin d’estimer le nombre d’échantillons à ignorer dans la trame décodée? Après recherche, le PTS est nul et DTS semble inutile non plus.

Est-il possible de rechercher avec précision à un moment particulier en utilisant ffmpeg ?

Il n’existe pas de recherche d’exemples exacts d’images ou d’échantillons audio dans ffmpeg, c’est un problème au niveau de l’application. La raison est assez simple: libavformat effectue la recherche et ne sait pas ce que contiennent les paquets renvoyés par chaque démultiplexeur. Il y a juste une goutte de données avec l’horodatage X et la durée Y. Il ne sait rien de ces données, vous devez les décoder pour faire quelque chose de significatif, c’est-à-dire libavcodec, pas libvformat.

Donc, pour répondre à vos questions: av_seek_frame cherche à séparer les paquets, AVSEEK_FLAG_BACKWARD signifie que le paquet sera ssortingctement avant le ts donné; pour l’audio, cela signifie que le paquet contiendra probablement votre horodatage. Cependant, ce n’est pas toujours le cas, car certains démultiplicateurs cherchent à se baser sur un index, et chaque paquet peut avoir une entrée d’index. Vous devrez peut-être appeler av_read_frame () plusieurs fois avant d’arriver au paquet contenant l’horodatage spécifié après la recherche.

A part l’appel de avcodec_flush (), libavcodec ne sait rien de la recherche. La sortie du prochain appel à avcodec_decode_audio4 commencera donc au début du paquet d’entrée. Pour rechercher des échantillons spécifiques, les applications doivent couper eux-mêmes les échantillons principaux.

Oui, le code source confirme que av_seek_frame recherche jusqu’aux limites du paquet.

Afin de chercher dans les paquets, j’utilise AVStream :: cur_dts horodatage mis à jour par av_seek_frame pour indiquer la limite recherchée. Avec cette valeur, il est possible de connaître le nombre d’échantillons restant à ignorer dans le paquet. Cela résout le problème.