Estou tentando concatenar dois arquivos mp4 usando ffmpeg. Eu preciso que este seja um processo automático, por isso escolhi o ffmpeg. Estou convertendo os dois arquivos em arquivos .ts, concatenando-os e tentando codificá-lo. Os arquivos são codificados h264 e aac e espero manter a qualidade igual ou o mais próximo possível do original.
ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4
Infelizmente, estou recebendo a seguinte mensagem de erro retornando do ffmpeg durante a codificação:
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file
Isso acontece na metade da codificação, o que me faz pensar que você não pode concaturar dois arquivos .ts e fazê-lo funcionar.
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(o mkv aceita mais codecs que o mp4, mas você também pode experimentá-lo com o mp4). O-safe 0
é para versões recentes do ffmpeg queixam-se do nome de arquivo inseguro e o-type f
é apenas para listar arquivos. Eu adicionei| sort
para classificar os arquivos em ordem alfabética; porque osfind
lê em ordem como salvos no sistema de arquivos. Funciona também para arquivos com espaços em branco.ffmpeg -i "concat:input1|input2" -codec copy output
. Não há necessidade de escapar do caractere de pipe.PARA ARQUIVOS MP4
Para arquivos .mp4 (que obtive do DailyMotion.com: um episódio de 50 minutos da TV, que pode ser baixado apenas em três partes, como três arquivos de vídeo .mp4), a seguir foi uma solução eficaz para o Windows 7 e NÃO envolve recodificar o arquivo arquivos.
Renomeei os arquivos (como arquivo1.mp4 , arquivo2.mp4 , arquivo3.mp4 ), de modo que as peças estivessem na ordem correta para a exibição do episódio de TV completo.
Depois, criei um arquivo em lotes simples (concat.bat), com o seguinte conteúdo:
o arquivo em lotes e o ffmpeg.exe devem ser colocados na mesma pasta que os arquivos .mp4 a serem ingressados. Em seguida, execute o arquivo em lotes. Normalmente, leva menos de dez segundos para ser executado.
.
Adenda (21/10/2018) -
Se o que você estava procurando é um método para especificar todos os arquivos mp4 na pasta atual sem muita redigitação, tente isso no arquivo em lotes do Windows em ( DEVE incluir a opção -safe 0 ):
Isso funciona no Windows 7, em um arquivo em lotes. Não tente usá-lo na linha de comando, porque ele funciona apenas em um arquivo em lotes!
fonte
C:\blah>type mylist.txt<ENTER>
(para que eles vejam o conteúdo desse arquivo).ffmpeg -f concat -i mylist.txt -c copy output.mp4<ENTER>
Além disso, você deve incluir uma referência trac.ffmpeg.org/wiki/Concatenate (essa referência ainda usa o mesmo nome de arquivo, mylist.txt)-i
parâmetro. No Linux, eu fiz isso: ols -1 P1041*.mp4 | sed s/"P"/" file P"/g > mylist.txt
que é ainda mais interessante do que codificar um script em lote. Enfim,-c copy
executa muito rapidamente (o que eu não sabia) e essa é a verdadeira mágica desta resposta.Aqui está uma maneira rápida (leva menos de 1 minuto) e sem perdas de fazer isso sem a necessidade de arquivos intermediários:
O "ls" contém os arquivos para ingressar O "perl" cria o arquivo de concatenação rapidamente em um pipe A parte "-i -" diz ao ffmpeg para ler no pipe
(note - meus arquivos não tinham espaços ou coisas estranhas - você precisará de escape de shell apropriado se quiser fazer essa idéia com arquivos "físicos").
fonte
ls Movie_Part_1.mp4 Movie_Part_2.mp4 | perl -ne '$_ =~ s/\n$//; print "file '"'"'$_'"'"'\n"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
ls * | perl -ne 'print "file $_"' | ffmpeg -f concat -i - -c copy Movie_Joined.mp4
se seus arquivos estiverem bem nomeados e em ordem. Funcionou muito bem para mim no OS X, exatamente o que eu queria.ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(o mkv aceita mais codecs que o mp4, mas você também pode tentar com o mp4). O-safe 0
é para versões recentes do ffmpeg queixam-se do nome de arquivo inseguro e o-type f
é apenas para listar arquivos. Eu adicionei| sort
para classificar os arquivos em ordem alfabética; porque osfind
lê em ordem como salvos no sistema de arquivos. Funciona também para arquivos com espaços em branco.ffmpeg
fazê-lo funcionar:-protocol_whitelist file,tcp,http,pipe
para arquivos MP4:
Se eles não forem exatamente os mesmos arquivos MP4 (100% mesmo codec, mesma resolução, mesmo tipo), será necessário transcodificá-los em fluxos intermediários primeiro:
NOTA! : A saída será como o primeiro arquivo (e não o segundo)
fonte
Eu estava tentando concatenar três
.mp3
arquivos de áudio em um.m4a
arquivo e esse comando ffmpeg funciona.Comando de entrada:
Significados de: "-filter_complex concat = n = 3: v = 0: a = 1" :
Para obter mais informações: use
ffmpeg -h full
todas as opções de impressão (incluindo todas as opções específicas de formato e codec, muito longas)fonte
-f concat -safe 0 -i "file.txt" -c copy -y "OutPut.mp4"
ele irá concat, mas quando alguns vídeos estão com áudio e outros sem áudio, não está funcionando, como posso resolver isso. Obrigado -Acabei usando mpg como formato intermediário e funcionou (NOTA: este é um exemplo perigoso, -qscale 0 irá recodificar o vídeo ...)
fonte
-sameq
foi removido. Use em-qscale 0
vez disso.-sameq
não significa "mesma qualidade" e foi removido do ffmpeg conforme mencionado por @XavierHo.concat
comando ffmpeg, como o @rogerdpack faz acima.Documentação detalhada sobre várias formas de concatenação no ffmpeg pode ser encontrada aqui .
Você pode usar o 'filtro Concat' para concatenação rápida.
Ele executa uma recodificação. Esta opção é melhor quando as entradas têm diferentes formatos de vídeo / áudio.
Para concatenar 2 arquivos:
Para concatenar 3 arquivos:
Isso funciona para o mesmo e para vários tipos de arquivos de entrada.
fonte
ouput.mp4
bitrate de vídeo é significativamente menor do que a vídeos de entrada de vídeo taxa de bitsDescobri que o operador do tubo não funcionou para mim ao usar a opção 3 para concaturar vários MP4s em um Mac na resposta aceita.
O one-liner a seguir funciona em um Mac (High Sierra) para concatenar mp4s, sem a necessidade de criação de arquivo intermediário.
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
fonte
Aqui, 2 soluções de bash puras usando apenas
ffmpeg
e não usandoSolução de uma linha usando
ls
Função que recebe 0 ou 2 ou mais argumentos
Nota: havia tentado algumas soluções neste segmento e nenhuma me satisfez
fonte
com base nas respostas de rogerdpack e Ed999, criei minha versão .sh
junta todos os
*.mp4
arquivos da pasta atual emjoined-out.mp4
testado no mac.
O tamanho do arquivo resultante é a soma exata dos meus 60 arquivos testados. Não deve haver nenhuma perda. Exatamente o que eu precisava
fonte
isso funcionou para mim (no windows)
um exemplo...
Pitão
Usando algum código python para fazê-lo com o maior número possível de mp4 em uma pasta (instale python em python.org, copie e cole e salve esse código em um arquivo chamado mp4.py e execute-o a partir do cmd aberto na pasta com python mp4.py e todos os mp4 da pasta serão concatenados)
Versão 2 com Python
Retirado do meu post no meu blog , é assim que eu faço em python:
fonte
Para
.mp4
arquivos, eu achei que funciona melhor e mais rápido para usar a ferramenta de linha de comando opensource:mp4box
. Então você pode usá-lo desta maneira:Faça o download aqui para a maioria das plataformas: https://gpac.wp.imt.fr/mp4box/
fonte
Aqui está um script que eu fiz para concatenar vários mp4 da GoPro em um mp4 de 720p. Espero que seja de ajuda.
fonte
Na documentação aqui: https://trac.ffmpeg.org/wiki/Concatenate
Essa abordagem funciona em todas as plataformas.
Eu precisava da capacidade de encapsular isso em um script de plataforma cruzada, então usei
fluent-ffmpeg
e vi a seguinte solução:fonte
fonte
Mesclando todos os arquivos mp4 do diretório atual
Pessoalmente, eu não gosto de criar arquivos externos que tenho que excluir posteriormente, então minha solução foi a seguir, que inclui a listagem de numeração dos arquivos (como
file_1_name, file_2_name, file_10_name, file_20_name, file_100_name
, ...)fonte
Após várias tentativas abaixo, o script funcionou para mim no windows 10 powershell.
Aqui, as duas primeiras linhas criam um arquivo de texto temp.txt que possui o seguinte conteúdo
3ª e 4ª linhas verificam se o ffmpeg está disponível no caminho e cria o "join.mp4"
As principais diferenças de outras respostas são as seguintes
para o meu arquivo mp4 acima funcionou, pode ser necessário usar outras alternativas, como abaixo, dependendo da codificação do vídeo.
Todos esses filtros Bitstream possíveis podem ser encontrados em https://ffmpeg.org/ffmpeg-bitstream-filters.html
fonte
Aqui está o meu método para ingressar em um diretório cheio de arquivos MP4 usando a substituição de comandos e o filtro de vídeo concat (isso será recodificado) - imaginamos que alguém obterá algum uso dessa linha única, especialmente se você tiver muitos arquivos (eu apenas juntou 17 arquivos de uma só vez):
Nota: este comando une seus arquivos na ordem em que são nomeados (ou seja, na mesma ordem em que são apresentados se você executar
ls *.mp4
) - no meu caso, cada um deles tinha um número de faixa, por isso funcionou muito bem.fonte
O protocolo concat descrito aqui; https://trac.ffmpeg.org/wiki/Concatenate#protocol
Quando implementado usando pipes nomeados para evitar arquivos intermediários
É muito rápido (leia-se: instantâneo), não possui quadros perdidos e funciona bem.
Lembre-se de excluir os arquivos de pipe nomeados e verifique se o vídeo é H264 e AAC com o qual você pode fazer apenas
ffmpeg -i filename.mp4
(verifique as menções h264 e aac)fonte
A resposta aceita na forma de script reutilizável do PowerShell
fonte