Outro vídeo ignora o áudio quando concatam dois vídeos

0

Eu quero concatir dois arquivos mp4 header.mp4 e body.mp4 . E eu uso o comando abaixo.

ffmpeg -i header.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i body.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts

Então eu concordo com eles.

ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

O arquivo de saída tem a duração correta, no entanto, o áudio de body.mp4 permanece apenas, em outra palavra, o vídeo de body.mp4 descarta em output.mp4 .

Se eu remover -c copy no terceiro comando, obtive o resultado correto, mas leva muito tempo. O que há de errado?

EDITAR

ffmpeg -i header.mp4 :

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
        built with Apple LLVM version 9.0.0 (clang-900.0.37)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-nonfree
        libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'header.mp4':
Metadata:
        major_brand     : isom
        minor_version   : 512
compatible_brands: isomiso2avc1mp41
encoder         : Lavf57.52.100
Duration: 00:00:04.04, start: 0.000000, bitrate: 644 kb/s
        Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 632 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 50 tbc (default)
Metadata:
        handler_name    : VideoHandler
        Stream #0:1(zho): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
        handler_name    : SoundHandler

e ffmpeg -i body.mp4

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
        built with Apple LLVM version 9.0.0 (clang-900.0.37)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-nonfree
        libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'body.mp4':
Metadata:
        major_brand     : mp42
        minor_version   : 0
compatible_brands: isommp42
creation_time   : 2017-03-01T09:47:27.000000Z
Duration: 00:01:33.14, start: 0.000000, bitrate: 241 kb/s
        Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 112 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
Metadata:
        creation_time   : 2017-03-01T09:47:27.000000Z
handler_name    : ISO Media file produced by Google Inc.
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
Metadata:
        creation_time   : 2017-03-01T09:47:27.000000Z
handler_name    : ISO Media file produced by Google Inc.
    
por LiJianixn 27.03.2018 / 12:13

1 resposta

1

O problema

Para concatenar suas entradas, deve ter os mesmos formatos e parâmetros. No seu caso, o vídeo tem taxas de quadros diferentes e o áudio tem taxas de amostragem diferentes.

Soluções

Você pode:

  • Codifique novamente uma das entradas para corresponder à outra e use o demuxer de concat ou
  • use alguns filtros para corrigir as diferenças e, em seguida, concatene usando o filtro de concat em um único comando.
  • Quase nunca recomendo usar o protocolo de concat porque o demuxer ou o filtro são geralmente opções melhores para a maioria dos usuários.

concat demxer

A vantagem é que apenas um vídeo é recodificado em vez de ambos e o processo pode ser mais rápido do que usar o filtro de concatenação.

Para corresponder header.mp4 a body.mp4 primeiro re-codifique header.mp4 :

ffmpeg -i header.mp4 -r 24 -ar 44100 -profile:v main -video_track_timescale 90k header_2.mp4

Crie um arquivo de texto, como input.txt , que contenha os nomes dos arquivos que você deseja concatenar:

file header_2.mp4
file body.mp4

Finalmente, use o demuxer de concat:

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

filtro de concat

A vantagem é que, se você for concatenar uma multiplicidade de fontes diferentes, poderá usar as mesmas opções de comando para todas elas (supondo que sua cadeia de filtros esteja usando os filtros apropriados).

ffmpeg -i header.mp4 -i body.mp4 -filter_complex "[0:v]fps=24[v0];[v0][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4

O filtro de concatilamento selecionará automaticamente um formato de pixel comum para fluxos de vídeo e um formato de amostra comum, taxa de amostragem e layout de canal para fluxos de áudio, portanto, se você está satisfeito em deixar que você não precise lidar com Essa. Caso contrário, adicione mais filtros.

Mais informações

por 29.03.2018 / 18:21

Tags