it-swarm.com.de

Wie füge ich mehrere (mehr als zwei) Videos unter Ubuntu zusammen?

Ich möchte Videos in einer Stapelgröße von jeweils zwanzig (20) zusammenführen. Ich verwende eine Linux-Maschine. Die Videos sind im mp4-Format und mäßiger Qualität. Bei einigen fehlt sogar der Audiostream. Bisher habe ich ffmpeg, mencoder, cvlc/vlc und MP4Box ausprobiert. Ich möchte ein Befehlszeilenskript schreiben, um dies zu erreichen, da ich die Stapelverarbeitung durchführe.

Das Hauptproblem ist, dass einige der Lösungen, die ich ausprobiert habe, für zwei Videos gut funktionieren, andere für Videos mit Audiostream und wieder andere für eine andere Teilmenge meines Videosets. Für diese Aufgabe konnte ich jedoch keine umfassende Lösung finden.

32
Dhruv Singal

Dies löste die Angelegenheit: https://stackoverflow.com/a/22324018/5014767

melt ist dafür ein großartiges Befehlszeilen-Dienstprogramm. hier ist die Seite

Bearbeiten von Kommentaren: Der Befehl, der mein Problem löste, war dieser melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264

6
Dhruv Singal

Ich verwende mkvmerge, um mehrere MP4-Dateien zu einer einzigen zu verbinden:

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
37

Sie können dies mit ffmpeg tun:

ffmpeg -i concat:"input1.mp4|input2.mp4" output.mp4

Hinweis und weitere Infos

24
Maythux

Ich habe ein kleines Shell-Skript geschrieben, um MP4s ohne Umcodierung mit ffmpeg zu komprimieren.

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

Dadurch werden Zwischendateien in einem MPEG-Container erstellt und dann zu einem MP4 verkettet.

4
RawwrBag

Mein Skript, rein in bash und ffmpeg. Kodiert in einer Befehlszeile angegebene Dateien neu in eine.

Erfordert, dass die Dateien dieselbe Auflösung haben. Akzeptiert verschiedene Metadaten-Rotationen, die ffmpeg concat: nicht zulässt.

rm ffmpeg-concat-output.mkv

FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in [email protected]; 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}"
0

Ich habe ein Python-Skript erstellt, das mit moviepy auch Untersegmente verketten kann (nützlich, wenn Sie zum Beispiel einige Teile aus einem Video entfernen möchten).

Verwenden Sie es mit:

vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>
0
Antonello