La communauté open source ou les développeurs actifs ont souvent besoin de publier de grands segments vidéo en ligne. (Vidéos de rencontres, camps, discussions techniques, etc.) Etant donné que je suis un développeur et non un vidéographe, je n'ai aucune envie de débourser la note supplémentaire sur un compte Vimeo premium. Comment puis-je prendre une vidéo de conversation technique MPEG de 12,5 Go (1:20:00) et la découper en segments 00:10:00 pour faciliter le téléchargement sur des sites de partage de vidéos?
ffmpeg
video-editing
Gabriel
la source
la source
Réponses:
Envelopper cela dans un script pour le faire en boucle ne serait pas difficile.
Attention, si vous essayez de calculer le nombre d'itérations en fonction de la durée de sortie d'un
ffprobe
appel, il est estimé à partir du débit binaire moyen au début du clip et de la taille du fichier du clip, à moins que vous ne donniez l'-count_frames
argument, ce qui ralentit considérablement son fonctionnement. .Une autre chose à prendre en compte est que la position de l'
-ss
option sur la ligne de commande est importante . Où je l'ai maintenant est lent mais précis. La première version de cette réponse donnait l' alternative rapide mais inexacte . L'article lié décrit également une alternative généralement rapide mais toujours précise, que vous payez avec un peu de complexité.Tout cela mis à part, je ne pense pas que vous souhaitiez vraiment couper exactement 10 minutes par clip. Cela mettra les coupes au beau milieu des phrases, même des mots. Je pense que vous devriez utiliser un éditeur ou un lecteur vidéo pour trouver des points de coupure naturels à un peu moins de 10 minutes d'intervalle.
En supposant que votre fichier soit dans un format accepté directement par YouTube, vous n'avez pas à le recoder pour obtenir des segments. Il suffit de transmettre les décalages naturels du point de coupure à
ffmpeg
, en lui demandant de transmettre le signal A / V codé sans toucher à l’aide du codec "copy":L'
-c copy
argument lui dit de copier tous les flux d'entrée (audio, vidéo et éventuellement d'autres, tels que les sous-titres) dans la sortie telle quelle. Pour les programmes audiovisuels simples, cela équivaut aux indicateurs plus détaillés-c:v copy -c:a copy
ou aux indicateurs de style ancien-vcodec copy -acodec copy
. Vous utiliseriez le style le plus détaillé lorsque vous souhaitez copier un seul des flux, mais recoder l'autre. Par exemple, il y a de nombreuses années, il était courant avec les fichiers QuickTime de compresser la vidéo avec la vidéo H.264 tout en laissant l'audio au format PCM non compressé ; Si vous rencontriez un tel fichier aujourd'hui, vous pourriez le moderniser-c:v copy -c:a aac
pour ne traiter que le flux audio, en laissant la vidéo intacte.Le point de départ pour chaque commande ci-dessus après la première est le point de départ de la commande précédente plus la durée de la commande précédente.
la source
ffmpeg
nécessaires pour maintenir la synchronisation entre les flux audio et vidéo risquent de ne pas être présentes dans le fichier source. Si cela vous arrive, il existe des méthodes plus complexes de fractionnement qui évitent le problème.Voici la solution en une ligne :
Veuillez noter que cela ne vous donne pas des scissions précises, mais devrait répondre à vos besoins. Au lieu de cela, il coupera à la première image après l'heure spécifiée après
segment_time
, dans le code ci-dessus, ce serait après la marque des 20 minutes.Si vous constatez que seul le premier morceau est jouable, essayez d’ajouter
-reset_timestamps 1
comme indiqué dans les commentaires.la source
-reset_timestamps 1
corrige le problème pour moiA fait face au même problème plus tôt et mis en place un script Python simple pour faire exactement cela (en utilisant FFMpeg). Disponible ici: https://github.com/c0decracker/video-splitter , et collé ci-dessous:
la source
Si vous voulez créer vraiment les mêmes morceaux, vous devez forcer ffmpeg à créer un cadre i sur le premier cadre de chaque morceau afin que vous puissiez utiliser cette commande pour créer un morceau de 0,5 seconde.
la source
Un autre moyen plus lisible serait
Voici la source et la liste des commandes FFmpeg couramment utilisées.
la source
Notez que la ponctuation exacte du format alternatif est
-ss mm:ss.xxx
. J'ai lutté pendant des heures pour essayer d'utiliser l'intuitif, maismm:ss:xx
inutilement.Références ici et ici .
la source
la source
Utilisez simplement ce qui est construit dans ffmpeg pour faire exactement cela.
Cela divisera le fichier en mandrins de 2 secondes environ, fractionné aux images clés appropriées, et sera exporté dans les fichiers cam_out_h2640001.mp4, cam_out_h2640002.mp4, etc.
la source