Questão Outro vídeo descarta o áudio esquerdo quando concatam dois vídeos


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 certa, no entanto, o áudio de body.mp4 só ficava, em outra palavra o vídeo de body.mp4 demitir em output.mp4.

Se eu remover -c copy no terceiro comando, obtive o resultado certo, mas demora muito tempo. O que está 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.

0


origem


Mostrar saída completa de ffmpeg -i header.mp4 e ffmpeg -i body.mp4 - LordNeckbeard
Você quer dizer primeiro e segundo comando? - LiJianixn
Você também pode mostrar a saída completa de seus dois comandos, sim. - slhck
@LiJianixn eu quis dizer apenas ffmpeg -i header.mp4 e ffmpeg -i body.mp4 (ou ffmpeg -i header.mp4 -i body.mp4 se você preferir, mas não esqueça os dois -i opções). Ele mostrará informações necessárias sobre suas entradas e sua ffmpeg. Essa solicitação costuma confundir os usuários. A saída dos seus primeiros e segundos comandos também será suficiente, mas a saída será muito mais longa e eu não preciso dessa informação extra. - LordNeckbeard
@LordNeckbeard Eu editei minha pergunta. - LiJianixn


Respostas:


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ê também pode:

  • Recodifique uma das entradas para corresponder à outra e use o demuxer concatou
  • usar alguns filtros para corrigir as diferenças, em seguida, concatenar usando o filtro de concat tudo em um comando.
  • Eu quase nunca recomendo usar o protocolo de concat como o demuxer ou filtro são geralmente melhores escolhas 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 concat.

Para combinar header.mp4 para body.mp4 primeiro recodificar header.mp4:

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

O faça um arquivo de texto, como input.txt, que contém 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

Vantagem é se você estiver indo para concatenar uma infinidade de fontes diferentes, você pode usar as mesmas opções de comando para todos eles (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 concatilização 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ê estiver satisfeito em deixar isso, não precisará lidar com eles. Caso contrário, adicione mais filtros.

Mais informações


1



Você pode explicar ffmpeg -i header.mp4 -r 24 -ar 44100 -profile:v main header_2.mp4 ? - LiJianixn
@LiJianixn Estas opções corresponderão às diferentes header.mp4 parâmetros para body.mp4. -r altera a taxa de quadros: header.mp4 é 30000/1001 (vulgo "29,97"), body.mp4 é 24. -ar altera a taxa de amostragem de áudio: header.mp4 é 48000, body.mp4 é 44100. -profile:v seleciona manualmente o perfil H264: header.mp4 é alto perfil, body.mp4é o perfil principal. - LordNeckbeard
concat demxer Nao funciona para mim. - LiJianixn
A duração de output.mp4 é 11:52. - LiJianixn
@LiJianixn Sem mais informações não posso sugerir nada. Mostrar informações para cada arquivo de entrada: ffmpeg -i input1 -i input2. Você pode usar um site pastebin e fornecer o link em um comentário. - LordNeckbeard