Je veux une commande de recherche FFmpeg aussi rapide et précise. J'ai trouvé ça .
La solution consiste à appliquer -ss
à la fois l'entrée (recherche rapide) et la sortie (recherche précise). Mais: si la recherche d'entrée n'est pas précise, comment pouvons-nous être sûrs que la position de recherche est exacte?
Par exemple: si nous voulions chercher à 00:03:00, la commande est quelque chose comme:
ffmpeg -ss 00:02:30 -i <INPUT> ... -ss 00:00:30 <OUTPUT>
Le premier -ss
cherchera ailleurs, non 00:02:30
, disons 00:02:31
. Et après avoir appliqué la deuxième recherche, le résultat final serait 00:03:01
- pas ce que nous voulons. Est-ce exact?
Où cherche le premier -ss
? Cherche-t-il l'image clé la plus proche 00:02:30
?
Si c'est le cas, voici ma pensée - corrigez-moi si je me trompe: après la première recherche, nous obtenons l'horodatage du résultat (dans cet exemple:) 00:02:31
, puis nous appliquons la deuxième recherche avec le temps approprié, dans ce cas 00:00:29
.
La question est: comment obtenir l'horodatage du premier résultat de recherche?
ffprobe
. Sinon, n'importe quel format intermédiaire ferait l'affaire, par exemple ProRes 422, DNxHD, qui sont visuellement sans perte et intra-trame uniquement. Ou vous utilisez quelque chose comme HuffYUV, etc. Mais alors vous perdriez à nouveau l'aspect "rapide", bien sûr.Unrecognized option 'select_streams'
select_streams
option a été ajoutée en octobre 2012 . :) Vous pouvez vous en passer, mais vous obtiendrez également des informations sur les trames audio, mélangées entre les deux.Je comprends que cette question remonte à plusieurs années, mais la dernière version de ffprobe a la possibilité de sauter des images . Vous pouvez transmettre des
-skip_frame nokey
informations de rapport uniquement sur les images clés (images I). Cela peut vous faire gagner beaucoup de temps! Sur un fichier MP4 1080p de 2 Go, cela prenait 4 minutes sans sauter les images. L'ajout du paramètre de saut ne prend que 20 secondes.Commander:
ffprobe -select_streams v -skip_frame nokey -show_frames -show_entries frame = pkt_pts_time, pict_type D: \ test.mp4
Résultats:
Ainsi, les résultats ne contiendront que des informations concernant les images clés.
la source
En s'appuyant sur la réponse de slhck , voici une fonction bash qui renverra l'image clé la plus proche qui se produit AVANT
N
secondes.Cela permet également de
-read_intervals
s'assurer que ffprobe ne commence à rechercher votre image clé que 25 secondes avant lesN
secondes. Cette astuce et la sortie awk lorsque l'horodatage est trouvé accélèrent considérablement les choses.exemple d'utilisation:
Je l'utilise pour découper des fichiers vidéo sans les réencoder. Comme vous ne pouvez pas ajouter de nouvelles images clés sans réencodage, j'utilise
ffnearest
pour rechercher l'image clé avant de vouloir couper. Voici un exemple:Notez que pour cet exemple, vous devrez peut-être modifier le format de ce qui est passé dans le
-ss
paramètre si vous recherchez plus de 60 secondes.(énervant, dire à ffmpeg de chercher exactement à l'horodatage de l'image clé semble faire ffmpeg exclure cette image clé dans la sortie, mais soustraire 0,5 seconde de l'horodatage réel de l'image clé fait l'affaire. Pour bash, vous devez utiliser
bc
pour évaluer les expressions avec des décimales , mais dans zsh-ss 00:00:$[$(ffnearest input.mkv 28)-0.5]
fonctionne.)la source
si vous souhaitez obtenir des informations sur les images I, vous pouvez utiliser
la source