Je veux juste boucler une vidéo mp4 avec ffmpeg et conserver les paramètres et le codec actuels.
Par exemple, si input.mp4 a une longueur de 0:10 et que je voudrais le boucler 4 fois, alors output.mp4 a une durée de 0:40, comment pourrais-je modifier la ligne de commande suivante pour le faire?
ffmpeg -i input.mp4 -c copy output.mp4
J'ai essayé...
ffmpeg -loop 4 -i input.mp4 -c copy output.mp4
... mais je reçois le message d'erreur "Option loop not found".
Réponses:
Démultiplexeur
Cela vous permet de boucler une entrée sans avoir à ré-encoder.
Faire un fichier texte. Contenu d'un exemple de fichier texte à répéter 4 fois.
Puis lancez
ffmpeg
:Pour les utilisateurs de Linux
Cet exemple est le même que ci-dessus mais vous n'avez pas à faire manuellement
list.txt
:Avec les coques modernes les plus couramment utilisées, vous pouvez même éviter
list.txt
entièrement la création du fichier. Par exemple, avec bash:Regarde aussi:
filtre de boucle
Exemple utilisant le filtre de boucle pour boucler 4 fois, chaque boucle est de 75 images, chaque boucle ignore les 25 premières images de l’entrée:
loop=3:75:25
loop=3
sera en boucle 4 fois.-1
.ffmpeg -h filter=loop
.filtre de film
Le filtre de film a une option de boucle. Voir la réponse ci-dessous de Monah Tuk. Le filtrage nécessite un ré-encodage. Pour l’audio, utilisez le filtre amovie.
-stream_loop
optionVoir la réponse ci-dessous par Thingy et la réponse par Gyan.
Notez que cette option était boguée (voir les rapports de bogue N ° 5719 , N ° 6121 et N ° 7043 ); elle risque donc de ne pas fonctionner pour les anciennes versions (toute version antérieure à 2018 06-27, y compris la branche de publication de FFmpeg 4.0.x). Pour les utilisateurs d'anciennes versions, comme indiqué par mulvya dans le ticket n ° 6121, l'une des solutions de contournement consiste à commencer par re-mux sur MKV ou TS, puis à utiliser
-stream_loop
dans la commande suivante.-loop
optionL'
-loop
option est spécifique au démultiplexeur de fichiers d'image et à gif muxer ; elle ne peut donc pas être utilisée pour des fichiers vidéo classiques, mais elle peut également être utilisée pour boucler en boucle une série d'images en entrée. Cet exemple sera répété plusieurs fois mais-t 30
limitera la durée de sortie à 30 secondes:Ou pour boucler une sortie GIF:
la source
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
section indique le même ticket que le premier ...Au moins sur FFmpeg 2.8.x (mais oldie devrait également fonctionner), vous pouvez utiliser
lavfi
comme format d’entrée et graphique de filtrage complexe l’utilisation demovie
etsetpts
filters comme argument d’-i
option.Prochaine commande faisant ce travail pour vous:
Zéro
loop=
argument signifie une boucle infinie. Les valeurs supérieures à zéro définissent les comptes répétés.setpts
les filtres requis pour l'ajustement PTS en fonction des répétitions suivantes et ultérieures, sinon la plupart des multiplexeurs en sortie échoueront avec une augmentation de PTS non monotone: la boucle ne recalcule pas PTS.Notez que l'utilisation de filtres supposant que les images de contournement sans décodage / encodage est impossible: par leur conception, les filtres ne traitent que des images décodées.
FFmpeg 2.8.2: nouvelle option d’entrée
-stream_loop
introduite. J'ai d'abord l'air que cela fonctionne plus simple et permet de copier du contenu sans transcodage:Mais il ne recalcule pas le PTS et le fichier de sortie est incorrect. Si vous ajoutez un filtre pour corriger le PTS (voir
setpts
), vous devez-c copy
également le supprimer . Seuls les filtres de flux de données peuvent traiter les paquets codés, mais il n’existe aucun filtre de flux de données pour corriger le PTS (voir: https://ffmpeg.org/ffmpeg-bitstream-filters.html ).Dans tous les cas, ffmpeg lors du second passage échoue avec l'erreur:
Solution connue pour moi : utiliser un conteneur pour un fichier d’entrée sans limite de PTS (conteneur en continu). L'un d'entre eux, connu de moi, est MPEG-TS. Vous pouvez donc convertir simplement votre fichier MP4 en MPEG-TS:
Et utilisez la commande suivante pour composer le fichier infinity:
(les filtres de flux binaires ne doivent être utilisés que si nécessaire, sur mes échantillons, il est requis)
FFmpeg> = 2.8.2 est requis dans ce cas.
la source
-c copy
. Réponse corrigée.Avec ffmpeg 2.8.4, la commande suivante crée output.mp4 qui est une copie répétée de input.mp4 jusqu'à ce que le processus ffmpeg soit arrêté:
Cette commande ne se terminera pas d'elle-même et le fichier de sortie grossira à l'infini.
la source
Q: "... comment pourrais-je changer la ligne de commande suivante pour faire cela? Ffmpeg -i input.mp4 -c copy output.mp4"?
R: La méthode simple qui évite les problèmes de commande de travail avec quelle version est la "solution triviale":
ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c copier la sortie.mp4
Voir aussi: https://trac.ffmpeg.org/wiki/Concatenate pour de nombreux exemples.
la source