Essayez d'utiliser ceci. C'est le moyen ffmpeg le plus rapide et le meilleur que j'ai trouvé :
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4
Cette commande découpe 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).
-ss : Utilisé avec -i, cela cherche dans le fichier d'entrée (input.mp4) à positionner.
00:01:00 : Il s'agit de l'heure à laquelle votre vidéo découpée commencera.
-à : Cela spécifie la durée du début (00:01:40) à la fin (00:02:12).
00:02:00 : Il s'agit de l'heure à laquelle votre vidéo découpée se terminera.
-c copier : Il s'agit d'une option pour couper via la copie de flux. (NB :Très rapide)
Le format d'heure est :hh:mm:ss
Veuillez noter que la réponse actuelle hautement votée est obsolète et que la coupe serait extrêmement lente. Pour plus d'informations, consultez cet article officiel de ffmpeg.
Voici ce que j'utilise et ne prendra que quelques secondes exécuter :
ffmpeg -i input.mp4 -ss 01:19:27 -to 02:18:51 -c:v copy -c:a copy output.mp4
Référence :découper des fichiers vidéo à l'aide de FFmpeg par Alexander Refsum Jensenius .
mp4
généré les fichiers peuvent également être utilisés dans iMovie
. Plus d'informations sur l'obtention de la durée complète à l'aide du modèle get_duration(input_video).
Si vous souhaitez concaténer plusieurs cinématiques, 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()
def 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()
print(output)
if __name__ == "__main__":
main()
L'exemple de script coupera et fusionnera les scènes entre 00:00:00 - 00:00:10
et 00:06:00 - 00:07:00
.
Si vous voulez couper la vidéo complète (au cas où vous voudriez convertir mkv
formater en mp4
) décommentez simplement la ligne suivante :
# times = [["00:00:00", get_duration(name)]]
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -c copy cut.mp4
Utilisez -c copie pour faire en instantanément. Dans ce cas, ffmpeg ne réencodera pas la vidéo, mais la coupera simplement à sa taille.
Vous n'avez probablement pas d'image clé à la marque des 3 secondes. Étant donné que les images non clés encodent les différences par rapport aux autres images, elles nécessitent toutes les données commençant par l'image clé précédente.
Avec le conteneur mp4, il est possible de couper à une image non clé sans réencoder à l'aide d'une liste d'édition. En d'autres termes, si l'image clé la plus proche avant 3s est à 0s, elle copiera la vidéo en commençant à 0s et utilisera une liste de montage pour dire au joueur de commencer à jouer 3 secondes plus tard.
Si vous utilisez le dernier ffmpeg de git master, il le fera à l'aide d'une liste de modification lorsqu'il sera invoqué à l'aide de 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 prend pas en charge les listes de modification. Certains lecteurs ignorent la liste de modification et lisent toujours tous les médias du fichier du début à la fin.
Si vous voulez couper précisément à partir d'une image non clé et que vous souhaitez qu'il soit lu à 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 ne se trouve pas réellement dans le fichier de sortie (par exemple s'il contient des informations confidentielles), vous pouvez le faire en ré-encodant afin qu'il y ait une image clé précisément à l'heure de début souhaitée. 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 le Guide d'encodage x264 de ffmpeg pour la vidéo et le Guide d'encodage AAC pour l'audio.
Aussi, le -t
L'option spécifie une durée, pas une heure de fin. La commande ci-dessus encodera 8 secondes de vidéo à partir de 3 secondes. Pour commencer à 3 s et terminer à 8 s, utilisez -t 5
. Si vous utilisez une version actuelle de ffmpeg, vous pouvez également remplacer -t
avec -to
dans la commande ci-dessus pour terminer à l'heure spécifiée.