web-dev-qa-db-fra.com

comment changer l'intervalle d'images clés dans ffmpeg

Je voulais définir l'intervalle d'images clés d'une vidéo d'entrée sur 5 secondes. Ce n'est qu'alors que je peux obtenir une segmentation HLS constante de 5 secondes en utilisant FFmpeg. Comment définir l'intervalle d'images clés à 5 secondes à l'aide de FFmpeg? (Code de ligne d'invite FFmpeg apprécié)

19
Samarth Misra

Vous devrez recoder. Réglez le paramètre keyint de x264 sur 5 * fps et désactivez Scenecut. Si votre fps est de 24 par exemple:

ffmpeg -i <input> -vcodec libx264 -x264-params keyint=120:scenecut=0 -acodec copy out.mp4

Ce n'est évidemment pas optimal pour la qualité mais cela correspondra à votre demande.

Modifié pour changer no-scenecut à scenecut=0, selon la suggestion du soupirant.

28
Ely

Soupir.

La désinformation concernant le no-scenecut L'option dure depuis plus longtemps que je ne me souvienne. N'entrez jamais de valeur pour no-scenecut.

Un lien vers la documentation peut être trouvé ici .

Pour FFmpeg, vous devez utiliser les deux commutateurs suivants:

-g 120 définira un GOP de 120 images pour créer un GOP de cinq secondes pour un contenu à 23,976 ips. Cela fonctionne en conjonction avec le no-scenecut option.

-x264opts no-scenecut forcera la création d'images clés selon la valeur GOP utilisée par FFmpeg. La valeur par défaut pour libx264 consiste à créer une image clé lorsqu'il détecte un changement de scène. Si vous inspectez un fichier de sortie à l'aide de MediInfo sans cette option, vous verrez scenecut=40. Une fois fait correctement, ce sera scenecut=0. Si cette option n'est pas utilisée, les images clés seront mal alignées pour le contenu ABR et la taille des segments sera imprévisible.

Ne prenez pas mon Word pour cela, veuillez exécuter ce qui suit sous un shell bash où $ inputfile est le nom du fichier que vous souhaitez analyser. Si vous utilisez les deux commutateurs illustrés ci-dessus, vous verrez une cadence très uniforme d'images clés transférées vers l'invite de commande.

ffprobe -select_streams v -show_frames -show_entries \
  frame=pict_type -of csv $inputfile | grep -n I | cut -d ':' -f 1

Vous pouvez également faire référence à un article que j'ai écrit sur la façon de créer un contenu aligné sur un cadre ABR ici .

15
Navilor