Concat dois arquivos mp4 com ffmpeg sem perder qualidade

16

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?

Eric Leschinski
fonte
O que você está tentando fazer exatamente? O termo "concat" significa unir vários arquivos, mas você está se referindo apenas a uma entrada output1.mp4e uma saída i0.ts. A codificação para o contêiner de saída ts usará o mpeg2videocodificador 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.
llogan
Desculpe. Então eu concatená-los com ffmpeg -i "concat: i0.ts | i1.ts" output1111.mp4. Mas o problema é que a qualidade é ruim já quando eu faço ts-arquivos
Pode não ser necessário recodificar o vídeo MPEG-2. Todas as suas entradas originais ( output1.mp4, etc) têm os mesmos formatos, taxa de quadros e tamanho de quadro?
Llogan
sim, exatamente. Todos são iguais
1
Veja também stackoverflow.com/questions/7333232/…
rogerdpack 15/16

Respostas:

36

Considere usar o concatdesmuxador . 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.).

  1. Crie um arquivo de texto e inclua os caminhos e nomes de cada arquivo para concatenar (ou "ingressar"). Arquivo de exemplo input.txt:

    file '/home/jenia/input1.mp4'
    file '/home/jenia/input2.mp4'
    file '/home/jenia/input3.mp4'
    
  2. Agora você pode usar o concatdesmuxer:

    ffmpeg -f concat -i input.txt -codec copy output.mp4
    

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:

llogan
fonte
Era exatamente isso que eu queria e me ajudou a mesclar 2 arquivos .mov do meu iPhone 6. Obrigado.
22716 Ryan
7

O 1-liner mais rápido seria:

ls Movie\ Part\ * | while read line; do echo file \'$line\'; done | ffmpeg -f concat -i - -c copy output.mp4
Hackeron
fonte
Alguma chance de obter uma linha de comando tão on-line para Windows?
PeterCo
2
No Linux, usei este oneliner: 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 | sortpara classificar os arquivos em ordem alfabética; porque os findlê em ordem como salvos no sistema de arquivos. Funciona também para arquivos com espaços em branco.
Erik