Desejo mesclar vídeos em lotes de vinte (20) cada. Estou executando uma máquina Linux. Os vídeos estão no formato mp4 e qualidade moderada. Alguns até têm o fluxo de áudio ausente. Até agora eu tentei ffmpeg
, mencoder
, cvlc/vlc
eMP4Box
. Quero escrever um script de linha de comando para conseguir isso, pois estou processando em lote.
O principal problema é que algumas das soluções que tentei funcionam bem para dois vídeos, algumas funcionam bem para vídeos com fluxo de áudio e outras ainda funcionam para outro subconjunto do meu conjunto de vídeos. No entanto, não consegui encontrar uma solução abrangente para esta tarefa.
ffmpeg
, incluindo filtros e protocolos de arquivo. Eu também tentei usar oconcat
recurso decvlc/vlc
. Eu também tentei oconcat
recurso demencoder
. Tudo isso funcionou parcialmente. Isso finalmente me ajudou a resolver o problema.melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
Respostas:
Estou usando
mkvmerge
para juntar vários arquivos MP4 em um único:fonte
.mkv
para o arquivo de saída, pois é um contêiner Matroska, independentemente da extensão que você fornecer.mkvmerge
: tipsonubuntu.comVocê pode fazer isso usando
ffmpeg
:referência e mais informações
fonte
Isso resolveu o problema: https://stackoverflow.com/a/22324018/5014767
melt
é um ótimo utilitário de linha de comando para isso. Aqui está a páginaEditar a partir dos comentários: O comando que resolveu meu problema foi este
melt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
fonte
Eu escrevi um pequeno script de shell para concaturar MP4s sem transcodificar usando ffmpeg.
Isso cria arquivos intermediários em um contêiner MPEG e os concatena em um MP4.
fonte
for f in *.MP4
sem usarls
. (Você sempre deve evitar o usols
de scripts por alguns motivos importantes; existem opções melhores.) Além disso, use aspas para variáveis, a menos que tenha certeza de que não há espaços ou outros caracteres especiais, portanto"${f}"
(ou apenas"$f"
) em vez de sem aspas$f
.CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
não funciona bem com nomes de arquivos 1, 2, 3 ... 10 ... 20. Ele acaba analisando-os como 1, 10 ... 2, 20 ... etc. Sugiro queCONCAT=$(echo $(ls -v *.ts) | sed -e "s/ /|/g")
isso garanta a ordem .Crie um arquivo files.txt com todos os arquivos que você deseja concatenar no seguinte formulário (as linhas que começam com # são ignoradas):
Observe que esses podem ser caminhos relativos ou absolutos. Em seguida, você pode transmitir em cópia ou recodificar seus arquivos:
fonte
Meu script, puramente em
bash
effmpeg
. Recodifica os arquivos fornecidos em uma linha de comando em um.Requer que os arquivos tenham a mesma resolução. Aceita diferentes rotações de metadados, o que
ffmpeg concat:
não.fonte
Criei um script Python que, usando moviepy , também pode concatenar subsegmentos (útil se você quiser, por exemplo, remover algumas partes de um vídeo).
Use-o com:
fonte
Além da resposta de Maythux, de :
Ou seja, os vídeos a serem concatenados usam um dos contêineres de vídeo mencionados acima (aos quais adicionarei MPEG-4 Parte 14 para experiência pessoal), você pode simplesmente:
fonte