Répéter/boucle la vidéo d'entrée avec ffmpeg?


34

Je veux juste boucler une vidéo MP4 avec ffmpeg et conserver les paramètres actuels et le codec.

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".

38

Démultiplexeur

Cela vous permet de boucler une entrée sans avoir à ré-encoder.

  1. Faire un fichier texte.Contenu d'un exemple de fichier texte à répéter 4 fois.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Puis exécutez ffmpeg :

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Pour les utilisateurs de Linux

Cet exemple est le même que ci-dessus mais vous n'avez pas à créer manuellement list.txt :

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Avec la plupart des coques modernes les plus utilisées, vous pouvez même éviter entièrement la création du fichier list.txt .Par exemple, avec bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Regarde aussi:


filtre de boucle

Exemple utilisant le loop filter pour effectuer une boucle 4 fois, chaque boucle représentant 75 images, chaque boucle ignorant les 25 premières images de l'entrée:

ffmpeg -i input -filter_complex loop=3:75:25 output
  • Le filtrage nécessite un ré-encodage.
  • Ce filtre places all frames into memory .
  • L'utilisation de loop=3 boucle 4 fois.
  • Pour effectuer une boucle infinie, utilisez -1 .
  • Vous devez indiquer le nombre d'images à boucler (indiqué par 75 dans l'exemple ci-dessus).La valeur maximale est 32767.
  • Voir aussi ffmpeg -h filter=loop .

filtre de film

Le movie filter a une option de boucle.Voir answer ci-dessous par Monah Tuk.Le filtrage nécessite un ré-encodage.Pour l’audio, utilisez le filtre amovie.


Option -stream_loop

Voir answer ci-dessous de Thingy et answer de Mulvya.Notez que cette option est défectueuse (voir les rapports de bogue #6121 et #5719) et peut ne pas fonctionner pour vous.Comme mentionné par mulvya dans le ticket n ° 6121, une solution de contournement consiste à re-muxager d'abord en MKV ou en TS puis à utiliser -stream_loop dans la commande suivante.


-loop option

L'option -loop est spécifique aux image file demuxer et gif muxer , elle ne peut donc pas être utilisée pour des fichiers vidéo classiques, mais elle peut être utilisée pour boucler une série infinie d'images d'entrée.Cet exemple fonctionnera en boucle mais le -t 30 limitera la durée de sortie à 30 secondes:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Ou pour boucler une sortie GIF:

ffmpeg -i input -loop 3 output.gif
  0

Est-ce que cela fonctionne bien avec les fichiers mp4? 28 oct.. 142014-10-28 19:08:12

+2

Je reçois cette erreur '><(pour i dans {1..4}; faire printf" fichier '% s' \ n "input.mp4; done) 09 nov.. 152015-11-09 18:46:50

  0

@jamesfzhang - Je pense que c'est parce que vous avez besoin d'un chemin absolu vers le fichier (comme expliqué ici: https://trac.ffmpeg.org/wiki/Concatenate).Pour cela, vous pouvez écrire: ffmpeg -safe 0 -f concat -i <(for i in {1..4}; ne pas printf "fichier '$ PWD'/'% s' \ n" input.mp4; done) -c copie la sortie.mp4 18 mai. 172017-05-18 15:57:46


14

Au moins sur 2.8.x FFmpeg (mais oldie devrait fonctionner aussi) que vous pouvez utiliser lavfi comme format d'entrée et le graphique de filtre complexe en utilisant movie et setpts filtres comme argument pour -i option.

Prochaine commande faisant ce travail pour vous:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Zéro loop= arguments signifie boucle à l'infini.Les valeurs supérieures à zéro définissent les comptes répétés.setpts filtres requis pour l'ajustement PTS en vue de répétitions secondes et ultérieures, sinon la plupart des multiplexeurs en sortie échoueront avec une augmentation 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.

À la FFmpeg 2.8.2 nouvelle option d'entrée -stream_loop inroduced.J'ai d'abord l'air que cela fonctionne plus simple et permet de copier du contenu sans transcodage:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

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 également supprimer -c copy .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 réparer le https://ffmpeg.org/ffmpeg-bitstream-filters.html PTS (voir: https://ffmpeg.org/ffmpeg-bitstream-filters.html).

Dans tous les cas, ffmpeg lors du second passage échoue avec l'erreur:

input.mp4: Resource temporarily unavailable

Connu travailler autour de moi: utiliser le conteneur pour le fichier d'entrée sans limites PTS (conteneur de streaming).L'un d'entre eux, connu de moi, est MPEG-TS.Vous pouvez donc convertir simplement votre fichier MP4 en MPEG-TS:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

Et utilisez la commande suivante pour composer le fichier infinity:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(les filtres en flux binaire ne doivent être utilisés que si nécessaire, sur mes échantillons, il est requis)

FFmpeg> = 2.8.2 est requis dans ce cas.

+1

L'exécution de cette commande me donne l'erreur suivante: "[mp4 @ 00000000053fa1a0] Impossible de trouver la balise pour le codec rawvideo dans le flux n ° 0, le codec n'est actuellement pas pris en charge dans le conteneur".Si j'ajoute -vcodec h264 avant l'entrée, cette erreur disparaît mais l'encodeur ne se ferme pas.Fournir un nombre de boucles différent de zéro génère beaucoup d'erreurs mais se termine.Le fichier n'est pas une sortie valide. 18 nov.. 152015-11-18 08:35:28

+1

La documentation de stream_loop indique "La boucle 0 ne signifie aucune boucle, la boucle -1 signifie une boucle infinie". 18 nov.. 152015-11-18 08:36:47

  0

Semble les fichiers d'entrée incorrects.Pourriez-vous s'il vous plait le partager?"La boucle 0 signifie pas de boucle, la boucle -1 signifie la boucle infinie."- Il semble que je voie de vieux docs :-) 18 nov.. 152015-11-18 13:43:11

  0

Les miens étaient des MP4 valides mais ne pouvaient pas partager ceux que j’avais utilisés. Vous pouvez en générer un en utilisant ffmpeg puis l’utiliser.Collez la sortie de la console si cela fonctionne. 18 nov.. 152015-11-18 14:56:17

+1

J'ai oublié: filtres supposant transcodage (décoder/encoder).Intentionnellement.Vous devez donc supprimer '-c copy'.Réponse corrigée. 18 nov.. 152015-11-18 16:48:45

+1

Bon à savoir, mais c'est une limitation importante si vous avez une grande boucle à générer. 18 nov.. 152015-11-18 17:02:13

  0

Ajoutez des informations sur stream_loop et WA pour résoudre le problème PTS sans ré-encoder.FFmpeg> = 2.8.2 est requis. 18 nov.. 152015-11-18 17:22:40

  0

@MonahTuk Je trouve que le filtre de boucle fonctionne beaucoup mieux que stream_loop (ce qui provoque une brève pause pour tous les fichiers que j'ai essayés), à une exception près: dès que j'ajoute le filtre de boucle, l'audio disparaît? 22 juin. 172017-06-22 12:56:13

  0

@ MikeVersteeg, vous devriez vérifier les fichiers.De temps en temps, différentes pistes dans le fichier ont une longueur légèrement différente ou un décalage peut affecter le multiplexage.Des problèmes dans des versions jamais de FFmpeg peuvent également être rencontrés.De plus, dans la plupart des cas, utilisez un conteneur MPEG TS en entrée et en sortie. 23 juin. 172017-06-23 00:05:28


10

Avec ffmpeg 2.8.4, la commande suivante crée output.mp4 qui est une copie répétée de input.mp4 jusqu’à l’arrêt:

ffmpeg -stream_loop -1 -i input.mp4 -c copy -fflags +genpts output.mp4
+2

Semble être la méthode la plus rapide 23 janv.. 172017-01-23 17:43:24

  0

La méthode la plus rapide est un euphémisme, cette méthode passe à la vitesse des vidéos de plusieurs heures en quelques secondes. 13 févr.. 182018-02-13 23:28:34


0

Q: "... comment pourrais-je changer la ligne de commande suivante pour le faire? 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.

  0

Cela ne fait aucune * concaténation.Au moins une des méthodes concat doit être utilisée: protocole, filtre ou démultiplexeur.Dans cette commande, le mappage automatique de ffmpeg sélectionne un flux vidéo, un flux audio et un sous-titre parmi les entrées.Comme ils sont identiques, cela équivaut à la première commande de l'OP. 11 mars. 172017-03-11 06:36:50

  0

Merci de tester Mulvya, car il diffère du comportement décrit dans la documentation: https://ffmpeg.org/ffmpeg.html#Description - S'il existe une similitude dans les noms de fichier avec "-i -i/tmp/test% d .mp4 "(et al.) est également possible. 11 mars. 172017-03-11 17:28:19