DTS não monótono em concat (ffmpeg)

17

Depois de executar este comando ffmpeg -f concat -i mylist.txt -c copy output.mp4- estou recebendo um output.mp4arquivo corrompido e esta mensagem:

ffmpeg -f concat -i mylist.txt -c copy output.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, concat, from 'mylist.txt':
  Duration: N/A, start: 0.000000, bitrate: 829 kb/s
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1440x900, q=2-31, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 15360 tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598061, current: 467644; changing to 598062. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598062, current: 468044; changing to 598063. This may result in incorrect timestamps in the output file.
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598063, current: 468444; changing to 598064. This may result in incorrect timestamps in the output file.
...
[mp4 @ 0x7f897a01bc00] Non-monotonous DTS in output stream 0:0; previous: 598362, current: 588044; changing to 598363. This may result in incorrect timestamps in the output file.
frame= 1472 fps=0.0 q=-1.0 Lsize=    5825kB time=00:00:49.04 bitrate= 973.0kbits/s
video:4903kB audio:877kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.776358%

Conteúdo de mylist.txt

file 'cut.mp4'
file 'cut2.mp4'

saída cut.mp4 do ffmpeg:

ffmpeg -i cut.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:39.04, start: 0.036281, bitrate: 837 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1440x900, 701 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

saída cut2.mp4 de ffmpeg:

ffmpeg -i cut2.mp4
ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 20.100 / 54. 20.100
  libavcodec     56. 26.100 / 56. 26.100
  libavformat    56. 25.101 / 56. 25.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 11.102 /  5. 11.102
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cut2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.25.101
  Duration: 00:00:10.07, start: 0.000000, bitrate: 1498 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1440x900, 1271 kb/s, 30 fps, 30 tbr, 12k tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 218 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

cut.mp4 Eu consegui esse comando ffmpeg -ss 00:00:11 -i myfile.mp4 -to 00:00:39 -vf 'drawbox= : x=0 : y=0 : color=invert' cut.mp4

cut2.mp4 Eu consegui esse comando ffmpeg -ss 00:00:00 -i myfile.mp4 -to 00:00:10 -c copy cut2.mp4

Pesquisei bastante - não encontrei nenhuma solução, talvez alguém possa me ajudar com essa.

output.mp4 é jogável, mas parece estranho.

insira a descrição da imagem aqui

whitesiroi
fonte
1
Você pode fornecer os dois arquivos de entrada para que eu possa executar testes?
Llogan
@LordNeckbeard sim, eu enviei para você, muito obrigado.
Whitesiroi
1
Não consigo duplicar o problema exato. Estou usando a versão estática mais recente disponível no tessus . Os arquivos de amostra parecem ser diferentes da captura de tela, mas parece estar funcionando bem no VLC e no QuickTime, exceto que a busca parece desarrumada. Eu testei em uma máquina OS X porque parece com o que você está usando.
Llogan
@ LordNeckbeard Muito obrigado, sim, com esta versão ffmpeg versão N-71996-g372aa07-tessus, ela funciona muito bem. Obrigado.
Whitesiroi
tl; dr; remova -c copypara permitir recodificação ou uso -c:a copyapenas. A etapa concat ainda pode ser usada, -c copypois todos os vídeos já foram recodificados. Observe que alguns vídeos com esse aviso ainda parecem -c copybons após a concat e, portanto, tudo bem.
皞 皞 21/09

Respostas:

10

Usando o mais recente ffmpeg

Usuários gerais sempre devem usar a ffmpegpartir da ramificação principal do git atual (o código mais recente disponível):

  • Ao encontrar um problema, a primeira coisa a fazer é verificar se você está usando uma compilação do git master.
  • É considerado estável.
  • Terá mais correções de bugs e recursos.
  • O desenvolvimento do FFmpeg é muito ativo .
  • Se você deseja obter suporte de recursos oficiais de ajuda, deve usar o git master.
  • Os lançamentos são para distribuidores.

Consulte a página de download do FFmpeg para obter várias opções ou consulte o Wiki do FFmpeg: guias de compilação .

Outras coisas

  • No seu comando, drawboxvocê pode copiar o áudio com vapor, em -c:a copyvez de recodificá-lo.

  • Ao usar -ss, -tofunciona apenas como esperado se -ssfor usado como uma opção de saída.

llogan
fonte
Muito obrigado, funciona melhor e mais rápido. Você também pode conferir este vídeo.stackexchange.com/questions/15477/… Só estou curioso para saber se isso pode ser simplificado.
Whitesiroi
@whitesiroi Claro. Respondi, embora pareça que eu fiz um comentarista infeliz.
Llogan
Desculpe por isso.
Whitesiroi
1

Conforme https://trac.ffmpeg.org/wiki/Concatenate

Eu tive esse mesmo problema. Estou executando o ffmpeg versão 2.6.3 em um mac. Eu converti meus clipes de origem para o formato .MTS com uma marca adicional de -q 0, atualizei as extensões no arquivo de texto e configurei meu arquivo de saída para .MTS quando executei o comando concat no ffmpeg. Funcionou como um encanto. Aqui está o meu fluxo de trabalho.

ffmpeg -i clip-1.MOV -q 0 clip-1.MTS

ffmpeg -i clip-2.MOV -q 0 clip-2.MTS

atualizou o arquivo de texto (mylist.txt) para ler:

file clip-1.MTS
file clip-2.MTS

Em seguida, execute o comando concat da seguinte maneira:

ffmpeg -f concat -i mylist.txt -c copy output.MTS

Trabalhou para mim! Você pode converter o output.MTS final para qualquer formato que você precisar.

Duncan Lindsey
fonte
este protocolo é sem perdas?
Becko
Não, o primeiro comando é convertido para MPEG-2, que não possui um modo sem perdas.
Gyan
1

Eu recebi erros semelhantes, e o áudio nos meus vídeos de saída às vezes estava fora de sincronia e às vezes faltava completamente, mas acabei usando o mkvmergemkvtoolnix.

Meus vídeos de entrada foram codificados com configurações diferentes e tinham dimensões diferentes, então eu os redimensionei e os codifiquei novamente usando ffmpeg:

for f in *.mp4;do w=1280;h=720;ffmpeg -i $f -filter:v "scale=iw*min($w/iw\,$h/ih):ih*min($w/iw\,$h/ih),pad=$w:$h:($w-iw*min($w/iw\,$h/ih))/2:($h-ih*min($w/iw\,$h/ih))/2" -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a libfdk_aac -vbr 3 -ac 2 -ar 44100 ${f%mp4}mkv;done

Alguns dos meus vídeos de entrada não tinham um canal de áudio, então usei um comando como este para adicionar um canal de áudio silencioso a eles:

for f in *.mkv;do ffprobe $f|&grep -q '1: Audio'||ffmpeg -i $f -f lavfi -i anullsrc -c:a libfdk_aac -shortest -c:v copy temp-$f;mv {temp-,}$f;done

Depois concatenei os vídeos:

mkvmerge -o /tmp/output.mkv $(printf %s\\n *.mkv|sed '1!s/^/+/')

Se seus arquivos de entrada tiverem as mesmas dimensões, o mesmo número de canais de áudio, a mesma taxa de amostragem de áudio e assim por diante, você poderá usar apenas mkvmergepara concatenar os arquivos sem perdas. Os arquivos de entrada para mkvmergetambém podem ter um contêiner MP4, mas o arquivo de saída terá um contêiner MKV, mesmo que sua extensão de nome de arquivo seja especificada como .mp4. Você pode executar ffmpeg -i output.mkv -c copy output.mp4para alterar o contêiner.

mkvmergetem uma sintaxe como mkvmerge -o output.mkv file1.mkv + file2.mkv + file3.mkv, onde mkvmerge -o output.mkv file1.mkv +file2.mkv +file3.mkvtambém é aceita.

nisetama
fonte
1

Com base na resposta realmente útil de Duncan:

for f in ./*.mp4; do ffmpeg -i $f -q 0 "${f%.*}.mts"; done

Então isso:

ffmpeg -f concat -safe 0 -i <(for f in ./*.mts; do echo "file '$PWD/$f'"; done) -c copy All.mts
Hans-J. Schmid
fonte
0

Quando eu uso o ffmpeg para remuxar algum vídeo gravado (pode ser TS, MP4 ou MKV) e obter os dts não monótonos no fluxo de saída - registros de data e hora, etc. A única maneira que encontrei de lidar com isso de forma confiável é usar o AviDemux. Com as configurações de cópia para áudio e vídeo e a seleção de MP4V2 Muxer, é possível ,, na opção Configurar, para selecionar Otimizar para streaming. O arquivo MP4 resultante agora pode ser usado no ffmpeg sem gerar mensagens de erro. Confie que isso é útil.

gjdgjd
fonte