Je souhaite fusionner des vidéos en lot de vingt (20). J'utilise une machine Linux. Les vidéos sont au format MP4 et de qualité moyenne. Certains ont même le flux audio manquant. Jusqu'ici j'ai essayéffmpeg
, mencoder
, cvlc/vlc
et MP4Box
. Pour ce faire, je souhaite écrire un script en ligne de commande, car je suis en train de traiter par lots.
Le problème principal est que certaines des solutions que j'ai essayées fonctionnent bien pour deux vidéos, certaines pour les vidéos avec flux audio et d'autres encore pour d'autres sous-ensembles de mon ensemble de vidéos. Cependant, je n'ai pas été en mesure de trouver une solution complète pour cette tâche.
ffmpeg
, notamment les filtres et les protocoles de fichiers. J'ai aussi essayé d'utiliser laconcat
fonctionnalité decvlc/vlc
. J'ai aussi essayé laconcat
fonctionnalité demencoder
. Tous ont fonctionné partiellement. Cela m'a finalement aidé à résoudre le problème.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Réponses:
J'utilise
mkvmerge
pour joindre plusieurs fichiers MP4 en un seul:la source
.mkv
pour le fichier de sortie, car c’est un conteneur Matroska, quelle que soit l’extension que vous donnez.mkvmerge
: tipsonubuntu.comVous pouvez le faire en utilisant
ffmpeg
:référence et plus d'infos
la source
Cela a résolu le problème: https://stackoverflow.com/a/22324018/5014767
melt
est un excellent utilitaire en ligne de commande pour cela. Voici la pageEditer des commentaires: La commande qui a résolu mon problème était ceci
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
la source
J'ai écrit un petit script shell concaténant des MP4 sans transcodage à l'aide de ffmpeg.
Cela crée des fichiers intermédiaires dans un conteneur MPEG, puis les concatène dans un MP4.
la source
for f in *.MP4
sans utiliserls
. (Vous devriez toujours éviter d'utiliser desls
scripts pour plusieurs raisons importantes; il existe de meilleures options.) Utilisez également des guillemets pour les variables, sauf si vous êtes certain qu'il n'y a pas d'espaces ou d'autres caractères spéciaux, donc"${f}"
(ou tout simplement"$f"
) au lieu de non mis entre guillemets$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
ne fonctionne pas bien avec les noms de fichiers 1, 2, 3 ... 10 ... 20. Il finit par les analyser comme 1, 10 ... 2, 20 ... etc. Je suggère queCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
cela assurera l'ordre .Créez un fichier fichier.txt avec tous les fichiers à concaténer sous la forme suivante (les lignes commençant par # sont ignorées):
Notez qu'il peut s'agir de chemins relatifs ou absolus. Ensuite, vous pouvez diffuser en streaming ou recoder vos fichiers:
la source
Mon script, purement dans
bash
etffmpeg
. Re-code les fichiers donnés sur une ligne de commande en un seul.Nécessite que les fichiers aient la même résolution. Accepte différentes rotations de métadonnées, ce qui
ffmpeg concat:
n'est pas le cas.la source
J'ai créé un script Python qui, à l'aide de moviepy , peut également concaténer des sous-segments (utile si vous souhaitez par exemple supprimer certaines parties d'une vidéo).
Utilisez-le avec:
la source
En plus de la réponse de Maythux, de :
Par exemple, les vidéos à concaténer utilisent l'un des conteneurs vidéo susmentionnés (auquel j'ajouterai MPEG-4 Part 14 pour une expérience personnelle), vous pouvez simplement:
la source