Estou lutando com .mp4 há cerca de 2 dias, tentando concatenar uma série de cerca de 20 em um único arquivo. Qualquer diferença entre os arquivos é um pesadelo. Alguns arquivos têm fps diferentes e outros proporções diferentes.
Queria saber se mp4 é o formato que devo usar ou se existe um formato melhor e mais fácil de usar para concatenação. O tempo não é um problema, simplesmente preciso de um formato de qualidade relativamente alta que concatene na maioria das circunstâncias.
Se isso não existir, qualquer sugestão sobre como lidar com propriedades extremamente variadas de arquivos mp4 (não tenho certeza do que pode diferir além do fps e da proporção entre vídeos que podem causar problemas) seria ótima.
Estou usando o ffmpeg para tentar concatenar os arquivos. Primeiro tentei usar o demuxer e depois o filtro concat, mas acho o filtro concat muito assustador e não sei como usá-lo.
Cada vídeo possui áudio, alguns possuem imagens estáticas e outros em movimento.
Responder1
Os arquivos multimídia são complexos, portanto a concatenação possui vários requisitos:
- Todos os segmentos a serem concatenados devem ter o mesmo número e tipo de fluxos.
- Todos os fluxos devem ter os mesmos parâmetros.
Como cada entrada pode variar em qualquer parâmetro arbitrário, recomendo usar o filtro concat. Você terá que conformar cada entrada a um conjunto comum de parâmetros usando filtros. O formato de entrada não importa tanto porque você irá recodificar tudo de qualquer maneira.
Exemplo básico e genérico onde main.mp4
tem vídeo e áudio e end.mp4
tem vídeo e não tem áudio. Todos os outros parâmetros são considerados diferentes. Os filtros usados aqui são: anullsrc, scale, pad, setsar, fps, format, aformat e concat.
ffmpeg -i main.mp4 -i end.mp4 -f lavfi -t 0.1 -i anullsrc=channel_layout=stereo:sample_rate=44100 -filter_complex "[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=25,format=yuv420p[v0];[1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=25,format=yuv420p[v1];[0:a]aformat=channel_layouts=stereo:sample_rates=44100[a0];[v0][a0][v1][2:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4
Existem várias maneiras de fazer isso e talvez seja necessário fazer ajustes com base em suas informações ou para atender às suas necessidades.