Couper des vidéos à des images exactes avec le filtre de sélection ffmpeg


16

Au lieu d'utiliser -sset de -torechercher des paramètres qui ne semblent pas très précis, puis-je couper des vidéos pour des numéros d'image donnés? Par exemple;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[Cadre 80e et cadre 560e inclus. Donc, au total, cela fait (560 - 80 +1) images]

Après les réponses et un peu de recherche, j'ai essayé quelques commandes. Mais jusqu'à présent, je n'ai pas trouvé de moyen acceptable.

Si quelqu'un veut couper le flux vidéo entre 250e et 750e images, c'est la voie à suivre. Cela donnera 501 images en sortie:

Remarque: movie.mp4 a 25 fps et sa fréquence d'échantillonnage audio 48k

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

Comme prévu, la sortie dure exactement 20 secondes.

En utilisant la même méthode pour l'audio:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

De façon inattendue, celui-ci a une très mauvaise précision. Il aurait dû me donner 960001 (960k + 1) échantillons qui équivalent à 20 secondes d'audio. Mais à la place, la sortie a duré 20,505 secondes et contient 984240 échantillons. De plus, si j'augmente la durée, l'erreur augmente également.

Ensuite, j'ai essayé d'utiliser les paramètres -ss -to pour couper le flux audio:

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

L'ancienne méthode classique fonctionne beaucoup mieux. La sortie a duré 20,003 secondes et contient 960144 échantillons. De plus, l'augmentation de la durée n'augmente pas l'erreur, l'erreur est constante, il y a toujours 144 échantillons en excédent avec ce fichier d'entrée.

Pour résumer: le selectfiltre fonctionne bien la plupart du temps, mais pas une sélection. Les -ssparamètres classiques fonctionnent mieux pour l'audio mais ne sont pas précis. De plus, il n'est pas possible d'utiliser -vf selectet de -ssparamètres ensemble, car -sscela affectera à la fois les flux audio et vidéo alors que nous voulons que cela n'affecte que l'audio.

Donc, pour couper précisément un fichier multimédia, je dois faire ces 3 étapes:

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

Cela donne les résultats les plus précis. La vidéo dure 20 000 secondes et l'audio avec une précision d'image de 20 000 secondes et contient un échantillon de 960144. Ne correspond pas exactement au flux vidéo, mais c'est OK. Il n'y a que 144 échantillons excédentaires. Le plus gros inconvénient est que chaque fois que je veux couper un fichier, je dois envoyer 3 commandes pour un travail simple et cela crée deux fichiers inutiles: a_stream.webm et v_stream.webm. Et le selectfiltre ne fonctionne pas sur certains fichiers d'entrée que j'ai essayés. Il fait le travail avec succès (?) Mais n'arrête jamais le processus d'encodage, donc je dois fermer l'invite de commande à chaque fois.


J'ai lu cette page avant de poster cette question. Cette page ne m'a pas aidé. Si une entrée a des fps variables, pouvons-nous simplement calculer en utilisant cette équation? Je ne pense pas. De plus, je ne pense pas que '-ss' me donnera une position précise. La recherche image par image serait mieux je suppose.
destor

Notez que l' -ssimage est précise (voir ici ). Avez-vous réellement une entrée fps variable? Ma réponse renvoie au fil de la liste de diffusion qui mentionne l'utilisation de selectfiltres où vous pouvez spécifier le numéro de la trame. As-tu essayé ça?
slhck

Je l' ai essayé d' utiliser selectet aselectfiltres pour les flux vidéo et audio. Selectest fidèle à l'image pour la vidéo, mais aselectpas à l'échantillon près. En fait, c'est loin d'être exact. Cela donne des résultats bien pires que l'utilisation des -ss -toparamètres simples . Pour cette raison, pour l'instant, j'utilise une combinaison de selectfiltre et de -ss -toparamètres pour obtenir la coupe la plus précise. Mais c'est une façon sale de le faire. S'il vous plaît regardez mon premier post, j'ai ajouté quelques
lignes de

version ffmpeg?
fie

Pourquoi essayez-vous de couper par un numéro d'image de toute façon. Si l'on a besoin de ce genre de précision, alors pourquoi ne pas utiliser avidemux? Peut-être que vos problèmes d'origine sont également dus au fait qu'il sélectionne l'image clé la plus proche?
fie

Réponses:


3

L'audio vient des secondes, pas des images, donc si vous voulez couper une vidéo, vous devez calculer les fps vidéo × 20 secondes comme ceci: 20 secondes de 23,97 fps = 479,4

Le découpage de l'image n'est pas précis car vous ne pouvez pas obtenir des images par seconde complètes pendant la dernière seconde, donc l'audio obtiendra plus de secondes ou seulement une demi-seconde ou un peu plus ou moins! Vous devriez peut-être utiliser des secondes au lieu d'images pour obtenir une coupe exacte, vous dites au ffmpeg de le faire pour vous. Et si vous obtenez 1 image supplémentaire, que diriez-vous de changer les 250e et 750e images en 250e et 749e images?! Utilisez moins 1 pour obtenir toujours le nombre d'images que vous demandez!


En fait, l'audio provient d'échantillons, pas de secondes ...
Anubioz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.