Quero concatenar 2 vídeos usando o ffmpeg. Estou usando:
ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts
Mas o arquivo mp4 que recebo parece muito pior do que o arquivo de origem.
Aqui estão as informações sobre os dois arquivos
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isom
creation_time : 2013-06-13 15:40:36
Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s
Input #0, mpegts, from 'i0.ts':
Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: Libav
Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
Como posso resolver este problema?
output1.mp4
e uma saídai0.ts
. A codificação para o contêiner de saída ts usará ompeg2video
codificador por padrão (pelo menos com a sua compilação), e da última vez que verifiquei a taxa de bits ou a configuração de qualidade padrão desse codificador-b:v 200k
é muito baixa para a maioria dos casos.output1.mp4
, etc) têm os mesmos formatos, taxa de quadros e tamanho de quadro?Respostas:
Considere usar o
concat
desmuxador . Dessa forma, você pode evitar a criação de arquivos intermediários temporários e com perdas e pular uma etapa extra de recodificação.Nota: Todas as entradas devem ter os mesmos tipos de fluxo (mesmos formatos, mesma base de tempo, etc.).
Crie um arquivo de texto e inclua os caminhos e nomes de cada arquivo para concatenar (ou "ingressar"). Arquivo de exemplo
input.txt
:Agora você pode usar o
concat
desmuxer:Se você não possui esse recurso, seu ffmpeg é muito antigo ou está usando um ffmpeg "falso" no fork do libav.
Construções estáticas fáceis de usar estão disponíveis para Linux, OS X e Windows através da página de download do FFmpeg , ou você pode seguir um guia passo a passo para compilar o ffmpeg .
Veja também:
fonte
O 1-liner mais rápido seria:
fonte
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 não seguro 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.