J'essaie de supprimer quelques sections d'une vidéo à l'aide de FFmpeg.
Par exemple, imaginez si vous avez enregistré une émission à la télévision et que vous vouliez supprimer les publicités. C'est simple avec un éditeur de vidéo graphique. il vous suffit de marquer le début et la fin de chaque clip à supprimer et de sélectionner Supprimer. J'essaie de faire la même chose à partir de la ligne de commande avec FFmpeg.
Je sais comment couper un seul segment dans une nouvelle vidéo comme ceci:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Cela coupe un clip de cinq secondes et l’enregistre en tant que nouveau fichier vidéo, mais comment puis-je faire l’inverse et enregistrer la vidéo entière sans le clip spécifié, et comment puis-je spécifier plusieurs clips à supprimer?
Par exemple, si ma vidéo pouvait être représentée par ABCDEFG, j'aimerais en créer une nouvelle composée d’ACDFG.
la source
Réponses:
Eh bien, vous pouvez toujours utiliser le
trim
filtre pour cela. Voici un exemple, supposons que vous souhaitiez découper des segments de 30 à 40 secondes (10 secondes) et de 50 à 80 secondes (30 secondes):Qu'est-ce que j'ai fait ici? J'ai coupé 30 premières secondes, 40-50 secondes et 80 secondes jusqu'à la fin, puis je les ai combinées en flux
out1
avec leconcat
filtre.À propos des points de repère: nous en avons besoin car trim ne modifie pas le temps d’affichage des images et, lorsque nous coupons le compteur de 10 secondes, le compteur du décodeur ne voit aucune image pendant ces 10 secondes.
Si vous voulez aussi avoir de l'audio, vous devez faire la même chose pour les flux audio. Donc, la commande devrait être:
la source
Je ne parviens jamais à faire fonctionner la solution ptQa, principalement parce que je ne peux jamais comprendre la signification des erreurs contenues dans les filtres ni la façon de les réparer. Ma solution semble un peu moins pratique car elle peut laisser des traces, mais si vous la mettez dans un script, le nettoyage peut être automatisé. J'aime également cette approche, car si quelque chose ne va pas à l'étape 4, vous obtenez les étapes 1 à 3 terminées, ce qui permet de remédier aux erreurs plus efficacement.
La stratégie de base consiste à utiliser
-t
et-ss
à obtenir des vidéos de chaque segment souhaité, puis à réunir toutes les parties de votre version finale.Supposons que vous ayez 6 segments ABCDEF toutes les 5 secondes et que vous souhaitiez A (0-5 secondes), C (10-15 secondes) et E (20-25 secondes):
ou
Cela créera les fichiers a.tvshow, c.tvshow et e.tvshow. Le
-t
dit combien de temps chaque clip est, donc si c est de 30 secondes, vous pourriez passer en 30 ou 0:00:30. L'-ss
option indique jusqu'où il faut aller dans la vidéo source, donc c'est toujours relatif au début du fichier.Ensuite, une fois que vous avez plusieurs fichiers vidéo, je crée un fichier
ace-files.txt
comme celui-ci:Notez le "fichier" au début et le nom de fichier échappé après cela.
Puis la commande:
Cela concats tous les fichiers
abe-files.txt
ensemble, en copiant leurs codecs audio et vidéo et crée un fichierace.tvshow
qui ne devrait contenir que les sections a, c et e. Alors souvenez - vous de supprimerace-files.txt
,a.tvshow
,c.tvshow
ete.tvshow
.Déni de responsabilité : Je ne sais pas à quel point cela est (in) efficace par rapport aux autres approches
ffmpeg
mais en ce qui concerne mes objectifs, cela fonctionne mieux. J'espère que ça aide quelqu'un.la source
ace-files.txt
dans votre exemple) avec:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
-safe 0
à la commande ffmpeg si vous utilisez des chemins de fichiers absolus pour que cela fonctionne. Vous pouvez également supprimer la$(pwd)/
partie de la sous-commande bash.J'ai fait un script pour accélérer le montage de la télévision enregistrée. Le script vous demande les heures de début et de fin des segments que vous souhaitez conserver et les divise en fichiers. Il vous donne des options, vous pouvez:
Vidéo en action: ici
Laissez-moi savoir ce que vous pensez.
la source
safe=0
, c.ffmpeg -f concat -safe 0 -i ...
-à- d. Voir ffmpeg.org/ffmpeg-all.html#Options-36Bien que la réponse fournie par ptQa semble fonctionner, j’ai développé une autre solution qui a fait ses preuves.
Ce que je fais est essentiellement de couper une vidéo pour chaque partie de la vidéo originale que je veux inclure dans mon résultat. Plus tard, je les concatène avec le Concat Demuxer expliqué ici .
La solution est la même que ce que j’ai essayé en premier et présenté des problèmes de synchronisation. Ce que j’ai ajouté, c’est la commande -avoid_negative_ts 1 lors de la génération des différentes vidéos. Avec cette solution, les problèmes de synchronisation disparaissent.
la source
Pour ceux qui ont du mal à suivre l'approche de ptQa, il existe un moyen légèrement plus simple de s'y prendre. Plutôt que de concaténer chaque étape, faites-les simplement à la fin.
Pour chaque entrée, définissez une paire A / V:
Définissez autant de paires que nécessaire, puis concatérez-les toutes en un seul passage, où n = nombre total d'entrées.
Cela peut facilement être construit en boucle.
Une commande complète qui utilise 2 entrées pourrait ressembler à ceci:
la source