Au lieu d'utiliser -ss
et de -to
rechercher 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
select
filtre fonctionne bien la plupart du temps, mais pas une sélection. Les -ss
paramètres classiques fonctionnent mieux pour l'audio mais ne sont pas précis. De plus, il n'est pas possible d'utiliser -vf select
et de -ss
paramètres ensemble, car -ss
cela 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 select
filtre 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.
-ss
image 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 deselect
filtres où vous pouvez spécifier le numéro de la trame. As-tu essayé ça?select
etaselect
filtres pour les flux vidéo et audio.Select
est fidèle à l'image pour la vidéo, maisaselect
pas à l'échantillon près. En fait, c'est loin d'être exact. Cela donne des résultats bien pires que l'utilisation des-ss
-to
paramètres simples . Pour cette raison, pour l'instant, j'utilise une combinaison deselect
filtre et de-ss
-to
paramè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é quelquesRéponses:
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!
la source