Como mesclar vários (mais de dois) vídeos no Ubuntu?

16

Eu quero mesclar vídeos em tamanho de lote de vinte (20) cada. Estou executando uma máquina Linux. Os vídeos estão no formato mp4 e com qualidade moderada. Alguns até mesmo têm o fluxo de áudio ausente. Até agora eu tentei ffmpeg , mencoder , cvlc/vlc e MP4Box . Eu quero escrever um script de linha de comando para conseguir isso, já que estou fazendo o processamento em lote.

A questão principal é que algumas das soluções que experimentei funcionam bem em dois vídeos, algumas funcionam bem em vídeos com fluxo de áudio e outras ainda funcionam bem em outros subconjuntos do meu conjunto de vídeos. No entanto, não consegui encontrar uma solução abrangente para essa tarefa.

    
por Dhruv Singal 16.06.2015 / 12:02

6 respostas

5

Isso resolveu o problema: link

melt é um ótimo utilitário de linha de comando para isso. Aqui é a página

Editar a partir de comentários: O comando que resolveu o meu problema foi este   melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264

    
por Dhruv Singal 16.06.2015 / 16:16
21

Estou usando mkvmerge para unir vários arquivos MP4 em um único:

mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
    
por Szabolcs Spindler 01.10.2016 / 11:45
14

Você pode fazer isso usando ffmpeg :

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

referência e mais informações

    
por Maythux 16.06.2015 / 12:24
0

Meu script, apenas em bash e ffmpeg . Recodifica os arquivos fornecidos em uma linha de comando em um.

Requer que os arquivos tenham a mesma resolução. Aceita rotação de metadados diferente, o que ffmpeg concat: não faz.

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}"
    
por Victor Sergienko 05.06.2017 / 07:45
0

Eu escrevi um pequeno shell script para concatenciar MP4s sem transcodificar usando o 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

Isso cria arquivos intermediários em um contêiner MPEG e concatena-os em um MP4.

    
por RawwrBag 07.04.2018 / 22:26
-1

Além da resposta da Maythux, de :

  

Alguns contêineres multimídia (MPEG-1, MPEG-2 PS, DV) permitem concatenar vídeo simplesmente concatenando os arquivos que os contêm.

Ou seja. os vídeos a serem concatenados usam um dos contêineres de vídeo mencionados acima (ao qual adicionarei MPEG-4 Parte 14 para experiência pessoal), você poderia simplesmente:

cat video1.ext video2.ext video3.ext > video4.ext
    
por kos 16.06.2015 / 12:49