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 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.
Cela a résolu le problème: https://stackoverflow.com/a/22324018/5014767
melt
est un excellent utilitaire de ligne de commande pour cela. Ici est la page
Editer des commentaires: La commande qui a résolu mon problème était ceci melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
J'utilise mkvmerge
pour joindre plusieurs fichiers MP4 en un seul:
mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
Vous pouvez le faire en utilisant ffmpeg
:
ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4
J'ai écrit un petit script shell pour concatteindre des MP4 sans transcodage à l'aide de ffmpeg.
for f in $(ls *.MP4); do
ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done
CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4
rm *.ts
Cela crée des fichiers intermédiaires dans un conteneur MPEG, puis les concatène dans un MP4.
Mon script, uniquement en bash
et ffmpeg
. 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 que ffmpeg concat:
ne fait pas.
rm ffmpeg-concat-output.mkv
FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
echo "Processing ${FNAME}"
INPUTS="${INPUTS} -i $FNAME"
if [ -z "${FILTER}" ]; then
FILTER="[$INDEX:v:0] [$INDEX:a:0]"
else
FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
fi
let INDEX+=1
done
COMMAND="ffmpeg ${INPUTS} \
-filter_complex '${FILTER} \
concat=n=${INDEX}:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' \
ffmpeg-concat-output.mkv"
# -af 'volume=15dB' # won't work with -filter_complex
bash -c "${COMMAND}"
J'ai créé un script Python qui, en utilisant moviepy , peut également concaténer des sous-segments (utile si vous souhaitez par exemple supprimer certaines parties d'une vidéo).
Utilisez-le avec:
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>