Quero juntar dois arquivos mp4 para criar um único. Os fluxos de vídeo são codificados em h264 e o áudio em aac. Não consigo recodificar os vídeos para outro formato devido a razões computacionais. Além disso, não posso usar nenhum programa da GUI, todo o processamento deve ser realizado com os utilitários de linha de comando do Linux. O FFmpeg não pode fazer isso para arquivos mpeg4, então usei o MP4Box:
MP4Box -add video1.mp4 -cat video2.mp4 newvideo.mp4
Infelizmente, o áudio fica todo misturado. Eu pensei que o problema era que o áudio estava no aac, então eu o transcodifiquei em mp3 e usei novamente o MP4Box. Nesse caso, o áudio é bom para a primeira metade de newvideo.mp4
(correspondente a video1.mp4
), mas então não há áudio e não posso navegar no vídeo também.
Meu próximo pensamento foi que os fluxos de áudio e vídeo apresentavam pequenas discrepâncias em seus comprimentos que eu deveria corrigir. Assim, para cada vídeo de entrada, dividi os fluxos de vídeo e áudio e os juntei à opção -shortest no FFmpeg.
Assim, para o primeiro vídeo eu corri:
avconv -y -i video1.mp4 -c copy -map 0:0 videostream1.mp4
avconv -y -i video1.mp4 -c copy -map 0:1 audiostream1.m4a
avconv -y -i videostream1.mp4 -i audiostream1.m4a -c copy -shortest video1_aligned.mp4
Da mesma forma, para o segundo vídeo e, em seguida, usou o MP4Box como anteriormente. Infelizmente isso também não funcionou. O único sucesso que tive foi quando ingressei nos fluxos de vídeo separadamente (por exemplo, videostream1.mp4 e videostream2.mp4) e nos fluxos de áudio (como audiostream1.m4a e audiostream2.m4a) e depois ingressei no vídeo e no áudio em um arquivo final. No entanto, a sincronização é perdida na segunda metade do vídeo. Concretamente, há um atraso de 1 segundo de áudio e vídeo. Todas as sugestões são realmente bem-vindas.
fonte
Respostas:
Atualmente, a melhor maneira de fazer isso é com o desmuxador concat . Primeiro, crie um arquivo chamado
inputs.txt
formatado da seguinte forma:Em seguida, basta executar este comando ffmpeg:
Veja também concatenação nas
ffmpeg
perguntas frequentes .Estou mantendo o seguinte aqui para o benefício de qualquer pessoa que utilize versões mais antigas do ffmpeg.
As versões mais recentes do ffmpeg podem fazer isso: você precisará remuxar os arquivos primeiro nos fluxos de transporte mpeg (bastante leve para o processador, pois está apenas alterando o formato do contêiner):
Se isso gerar um erro sobre o h264, talvez você precise usar:
Você precisará fazer isso separadamente com cada arquivo de entrada. Para concatenar os arquivos juntos, use:
Se isso gerar um erro sobre o aac, talvez você precise usar o
Se o seu sistema suportar pipes nomeados, você poderá fazer isso sem criar arquivos intermediários.
Você precisará fazer o seguinte em três terminais virtuais separados:
Se o output.mp4 já existir, o terceiro ffmpeg perguntará se você deseja substituí-lo, mas fará isso depois de acessar os FIFOs , e isso fará com que o primeiro ffmpegs seja fechado. Portanto, certifique-se de escolher um nome não utilizado para o seu arquivo de saída.
Isso pode não funcionar se os arquivos de entrada forem diferentes - acredito que as diferenças na taxa de bits sejam aceitáveis, mas o tamanho do quadro, a taxa de quadros etc. devem corresponder.
fonte
*** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
é uma mensagem que vejo agora em execuçãoffmpeg
avconv
Para mp4, a única solução que encontrei foi com o MP4Box do pacote gpac
ou comando é
com mencoder e avconv eu não poderia fazê-lo funcionar :-(
fonte
Obrigado pelo script dvo. Foi um ótimo ponto de partida para mim. Como não tive problemas em usar pipes nomeados, adaptei o script para usá-los. Além disso, eu o consertei para trabalhar com nomes de arquivos com espaços neles. A saída para pipes nomeados não "vai" até que você comece a ler deles, daí a necessidade de colocar em segundo plano as tarefas de remux inicial com um & antes da chamada final para avconv. Além disso, não se esqueça de usar -c copy ou você acaba recodificando o lote inteiro.
fonte
Em um Mac (macOS 10.13 High Sierra), usei o seguinte com êxito:
Reordene como descrito acima da mesma forma, se necessário (observe que o ./ foi removido - o caminho estava causando o ffmpeg lançar o erro de nome de arquivo não seguro).
Então eu tive que remover o codec e a taxa de bits especificados para o padrão MacPorts ffmpeg para gostar:
fonte
Aqui está uma lista que torna tudo muito mais fácil. Ele faz tudo o que é necessário para finalmente fornecer um arquivo de vídeo resultante. Felicidades!
fonte
Obrigado evilsoup; Aqui está um pequeno script para automatizar o processo, usando o mais recente
avconv
.BTW, pipes nomeados não funcionaram para mim (a saída para eles ficou bloqueada).
fonte
Tiveram grande sucesso com
pode ser necessário reorganizar levemente o mylist.txt
ffmpeg versão 2.2.3
fonte