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.
select
et aselect
filtres pour les flux vidéo et audio. Select
est fidèle à l'image pour la vidéo, mais aselect
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 de select
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é quelques