792 votes

Découpage des vidéos en fonction de l'heure de début et de fin à l'aide de ffmpeg

J'ai essayé de couper la vidéo en utilisant l'heure de début et de fin de la vidéo en utilisant la commande suivante

ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4

En utilisant la commande ci-dessus je veux couper la vidéo à partir de 00:00:03 à 00:00:08 . Mais il ne coupe pas la vidéo entre ces deux moments, au lieu de cela, il coupe la vidéo avec les 11 premières secondes. Quelqu'un peut-il m'aider à résoudre ce problème ?

Edit 1 :

J'ai essayé de couper en utilisant la commande suivante qui est suggérée par mark4o

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Mais l'erreur suivante s'est produite.

le codeur 'aac' est expérimental mais les codecs expérimentaux ne sont pas activés

J'ai donc ajouté le -strict -2 dans la commande, c'est-à-dire,

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4

Maintenant, il fonctionne bien.

4 votes

Votre sortie de console ffmpeg complète et non coupée est manquante. Veuillez toujours l'inclure dans votre demande. Merci.

4 votes

D'où vient -strict 2 ? Je suis juste curieux car ce n'est pas dans la documentation : ffmpeg.org/ffmpeg.html

0 votes

C'est pour la qualité après l'installation de ffmpeg, dans l'aide de ffmpeg vous pouvez trouver cette option.

922voto

George Chalhoub Points 2494

Essayez d'utiliser ceci. C'est le moyen le plus rapide et le meilleur pour ffmpeg que j'ai trouvé :

 ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4

Cette commande permet de découper votre vidéo en quelques secondes !

Explication de la commande :

-i : Ceci spécifie le fichier d'entrée. Dans ce cas, c'est (input.mp4).
-s : Utilisé avec -i, ceci cherche dans le fichier d'entrée (input.mp4) à positionner.
00:01:00 : Il s'agit de la durée à laquelle votre vidéo découpée commencera.
- à.. : Ceci indique la durée du début (00:01:40) à la fin (00:02:12).
00:02:00 : Il s'agit de la durée à laquelle votre vidéo découpée se terminera.
-c copie : Il s'agit d'une option de découpage par copie de flux. (NB : Très rapide)

Le format du calendrier est le suivant : hh:mm:ss

Veuillez noter que la réponse actuelle, qui a fait l'objet d'un grand nombre de votes, est dépassée et que l'ajustement serait extrêmement lent. Pour plus d'informations, consultez le site officiel de ffmpeg. article .

781voto

mark4o Points 20472

Vous n'avez probablement pas d'image-clé au bout de 3 secondes. Comme les non-images-clés codent les différences par rapport aux autres images, elles nécessitent toutes les données à partir de l'image-clé précédente.

Avec le conteneur mp4, il est possible de couper à une image non clé sans ré-encodage en utilisant une liste de montage. En d'autres termes, si l'image clé la plus proche avant 3s est à 0s, la vidéo sera copiée à partir de 0s et une liste de montage sera utilisée pour indiquer au lecteur de commencer la lecture à 3 secondes.

Si vous utilisez le dernier ffmpeg à partir de git master, il le fera en utilisant une liste d'édition lorsqu'il sera invoqué en utilisant la commande que vous avez fournie. Si cela ne fonctionne pas pour vous, vous utilisez probablement une ancienne version de ffmpeg, ou votre lecteur ne supporte pas les listes d'édition. Certains lecteurs ignorent la liste de montage et lisent toujours tous les médias du fichier du début à la fin.

Si vous voulez couper précisément à partir d'une non-image clé et que vous voulez qu'elle soit lue à partir du point souhaité sur un lecteur qui ne prend pas en charge les listes de montage, ou si vous voulez vous assurer que la partie coupée n'est pas réellement dans le fichier de sortie (par exemple s'il contient des informations confidentielles), alors vous pouvez le faire en ré-encodant afin qu'il y ait une image clé précisément au moment de départ souhaité. Le ré-encodage est la valeur par défaut si vous ne spécifiez pas copy . Par exemple :

ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4

Lors du réencodage, vous pouvez également souhaiter inclure des options supplémentaires liées à la qualité ou un encodeur AAC particulier. Pour plus de détails, consultez la page de ffmpeg Guide d'encodage x264 pour la vidéo et Guide de codage AAC pour l'audio.

En outre, le -t spécifie une durée, et non une heure de fin. La commande ci-dessus encodera 8s de vidéo en commençant à 3s. Pour commencer à 3s et finir à 8s, utilisez -t 5 . Si vous utilisez une version actuelle de ffmpeg, vous pouvez également remplacer -t avec -to dans la commande ci-dessus pour se terminer à l'heure spécifiée.

7 votes

Y a-t-il un raccourci pour spécifier jusqu'à la fin de la vidéo ?

41 votes

@JikkuJose : Omettre le -t / -to et son argument pour continuer jusqu'au bout.

72 votes

Remarque : il est plus rapide de fournir -ss AVANT le fichier d'entrée (avant -i ), car de cette façon, ffmpeg passera directement à l'emplacement. Cependant, cela mettra aussi le temps "zéro" à cet endroit, ce qui signifie que -to indiquera le mauvais moment. Source : trac.ffmpeg.org/wiki/Seeking

116voto

Putnik Points 94
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4 

Utilisez -c copie pour faire dans l'instant. Dans ce cas, ffmpeg ne réencodera pas la vidéo, mais la coupera à la taille voulue.

45voto

alper Points 265

Voici ce que j'utilise et qui ne prend qu'un quelques secondes pour courir :

ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4

Référence : https://www.arj.no/2018/05/18/trimvideo


Généré mp4 pourraient également être utilisés dans iMovie . Plus d'infos pour obtenir la durée complète en utilisant get_duration(input_video) modele.


Si vous voulez concaténer plusieurs scènes coupées, vous pouvez utiliser le script Python suivant :

#!/usr/bin/env python3

import subprocess

def get_duration(input_video):
    cmd = ["ffprobe", "-i", input_video, "-show_entries", "format=duration",
           "-v", "quiet", "-sexagesimal", "-of", "csv=p=0"]
    return subprocess.check_output(cmd).decode("utf-8").strip()

if __name__ == "__main__":
    name = "input.mkv"

    times = []
    times.append(["00:00:00", "00:00:10"])
    times.append(["00:06:00", "00:07:00"])

    # times = [["00:00:00", get_duration(name)]]

    if len(times) == 1:
        time = times[0]
        cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", "output.mp4"]
        subprocess.check_output(cmd)
    else:
        open('concatenate.txt', 'w').close()
        for idx, time in enumerate(times):
            output_filename = f"output{idx}.mp4"
            cmd = ["ffmpeg", "-i", name, "-ss", time[0], "-to", time[1], "-c:v", "copy", "-c:a", "copy", output_filename]
            subprocess.check_output(cmd)

            with open("concatenate.txt", "a") as myfile:
                myfile.write(f"file {output_filename}\n")

        cmd = ["ffmpeg", "-f", "concat", "-i", "concatenate.txt", "-c", "copy", "output.mp4"]
        output = subprocess.check_output(cmd).decode("utf-8").strip()

Exemple script coupera et fusionnera les scènes entre elles 00:00:00 - 00:00:10 et 00:06:00 - 00:07:00 .


Si vous voulez couper la vidéo complète (dans le cas où vous voulez convertir mkv en format mp4 ) il suffit de décommenter la ligne suivante :

# times = [["00:00:00", get_duration(name)]]

35voto

JFMD Points 349
    ffmpeg -i movie.mp4 -vf trim=3:8 cut.mp4

Laissez tomber tout sauf de la seconde 3 à la seconde 8.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X