ffmpeg 4.1 ne définit pas l’image i / image clé au début du segment

0

J'essaie de créer quelques scripts d'automatisation pour convertir des vidéos à l'aide de ffmpeg. Les images clés se retrouvent au mauvais endroit lorsque le format est défini sur HLS. Cela se produit avec différentes sources (par exemple une version 4k de Big Buck Bunny ). J'utilise une version compilée statique de ffmpeg 4.1 de John Vansickle .

Lorsque je convertis au format MP4 / h264, les images clés sont dans le code temporel prévu (toutes les 2 secondes). C'est la commande que je lance:

ffmpegparams="-c:a aac -ar 22050 -c:v libx264 -profile:v high 
              -level 4.1 -crf 20 -r 30 -g 180 -keyint_min 30 
              -force_key_frames expr:gte(t,n_forced*2)"
ffmpeg -hide_banner -y -i video.mp4 \
  -vf scale=w=640:h=360:force_original_aspect_ratio=decrease $ffmpegparams \
  -b:v 400k -maxrate 428k -bufsize 600k -b:a 64k video-360p.mp4 \
  -vf scale=w=854:h=480:force_original_aspect_ratio=increase $ffmpegparams \
  -b:v 600k -maxrate 652k -bufsize 900k -b:a 64k video-480p.mp4 \
  -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease $ffmpegparams \
  -b:v 1000k -maxrate 1070k -bufsize 1500k -b:a 96k video-720p.mp4

Et la commande que je lance pour voir les images clés est

 ffprobe -v error -skip_frame nokey -show_entries frame=pkt_pts_time \
         -select_streams v -of csv=p=0 video-360p.mp4

qui sort

0.000000
2.000000
4.000000
[...]

Lorsque je convertis la même vidéo en ts / x264 (HLS), les images clés sont décalées de 1,466 seconde. C'est la commande que j'utilise (le même problème se produit si la sortie est segmentée plutôt que dans un seul fichier)

ffmpegparams="-c:a aac -ar 22050 -c:v libx264 -profile:v high -level 4.1 
              -crf 20 -r 30 -g 180 -keyint_min 30 
              -force_key_frames expr:gte(t,n_forced*2) -hls_time 6 
              -hls_playlist_type vod -hls_flags single_file"
ffmpeg -hide_banner -y -i video.mp4 \
  -vf scale=w=640:h=360:force_original_aspect_ratio=decrease $ffmpegparams \
    -b:v 400k -maxrate 428k -bufsize 600k -b:a 64k \
    -hls_segment_filename "video-360p.ts" video-360p.m3u8 \
  -vf scale=w=854:h=480:force_original_aspect_ratio=increase $ffmpegparams \
    -b:v 600k -maxrate 652k -bufsize 900k -b:a 64k \
    -hls_segment_filename "video-480p.ts" video-480p.m3u8 \
  -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease $ffmpegparams \
    -b:v 1000k -maxrate 1070k -bufsize 1500k -b:a 64k \
    -hls_segment_filename "video-720p.ts" video-720p.m3u8

Et exécutez ffprobe sur l’un des tsfichiers, j’obtiens les codes temporels suivants pour les images clés:

1.466667
3.466667
5.466667
[...]

Lorsque je lis l'un des tsfichiers au cours des 1,46 premières secondes, l'image est figée.

Je me demande si quelqu'un pourrait m'aider à comprendre ce qui se passe et comment y remédier.

Augusto
la source
1
Les fichiers TS, par défaut, ont un décalage d’horodatage de 1,4 s. Donc, c'est prévu. Comment vérifiez-vous le gel?
Gyan
@ Gyan merci pour l'info. Je ne fais que lire le fichier dans VLC, et l’autre conséquence est que je passe ensuite à la seconde égale en utilisant un lecteur Web (videojs), l’image se fige pendant une seconde avant que la lecture ne reprenne. Cela n'arrive pas aussi mal si je passe à une seconde impaire. Savez-vous alors comment fonctionne HLS? comme la première image d'un segment devrait être une image clé, mais vous dites que les images clés sont décalées de 1,4 seconde ...
Augusto
La «position» du KF n'a pas changé. Le décalage est ajouté à tous les horodatages. Vous pouvez remplacer la valeur par défaut en ajoutant -muxdelay 0 -muxpreload 0.
Gyan
Merci Gyan! Juste pour ajouter un peu de confusion, je viens de télécharger un fichier de test à partir du site de streaming Apple Dev et il présente le même comportement dans vlc (vidéo bloquée pendant environ une seconde, tandis que la lecture audio). Je pense que j'ai besoin de RTFM de ts:).
Augusto
En réalité, il ne s'agissait pas d'un problème, mais je me suis senti confus après tous les tests que j'ai effectués, car certains d'entre eux avaient des GOP étranges et des intervalles d'images clés. Pour une raison quelconque, VLC prend un moment pour commencer à lire la vidéo (lorsque l’audio est lu) sur un tsfichier correctement encodé . Mais lire les mêmes tsfichiers dans videojs n’affiche pas ce comportement du tout. Merci beaucoup @Gyan, ton commentaire m'a fait douter de ce que j'avais déjà essayé et le tester à nouveau.
Augusto