Compile vídeo e concatene usando ffmpeg - obtendo erros “Não-monótono do DTS no fluxo de saída”

3

Eu tenho dois vídeos, e eu preciso deixar ambas as extremidades para ambos os vídeos e deixar apenas a parte do meio, e então concatenar as partes do meio juntas. Ambos os vídeos são exatamente da mesma origem - mesmo FPS e mesmo codec.

O que estou tentando fazer:

ffmpeg -i 0.mp4 -c:v h264_nvenc -preset fast -rc vbr -qmin 1 -qmax 1 -filter_complex "[0:v]trim=start=01.00:duration=03.00,setpts=PTS-STARTPTS[vmiddle]" -map [vmiddle] middle_0.mp4
ffmpeg -i 1.mp4 -c:v h264_nvenc -preset fast -rc vbr -qmin 1 -qmax 1 -filter_complex "[0:v]trim=start=01.00:duration=03.00,setpts=PTS-STARTPTS[vmiddle]" -map [vmiddle] middle_1.mp4

Estes dois comandos cortam apenas a parte média de cada vídeo, começando às 01:00 e terminando às 04:00.

Então concateno vídeos:

ffmpeg -y -f concat -i concat.txt -c copy concat.mp4

Com o arquivo concat.txt obviamente contendo:

file 'middle0.mp4'
file 'middle1.mp4'

Mas isso não funciona. O vídeo de saída concat.mp4 contém falhas estranhas e eu recebo muitos erros no console:

[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000025ead60] Auto-inserting h264_mp4toannexb bitstream filter
[concat @ 0000000000dd6bc0] DTS 34666 < 45568 out of order
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45568, current: 34666; changing to 45569. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45569, current: 35050; changing to 45570. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45570, current: 35434; changing to 45571. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45571, current: 35818; changing to 45572. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45572, current: 36202; changing to 45573. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45573, current: 36586; changing to 45574. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45574, current: 36970; changing to 45575. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45575, current: 37354; changing to 45576. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45576, current: 37738; changing to 45577. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45577, current: 38122; changing to 45578. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45578, current: 38506; changing to 45579. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45579, current: 38890; changing to 45580. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45580, current: 39274; changing to 45581. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45581, current: 39658; changing to 45582. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45582, current: 40042; changing to 45583. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45583, current: 40426; changing to 45584. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45584, current: 40810; changing to 45585. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45585, current: 41194; changing to 45586. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45586, current: 41578; changing to 45587. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45587, current: 41962; changing to 45588. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45588, current: 42346; changing to 45589. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45589, current: 42730; changing to 45590. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45590, current: 43114; changing to 45591. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45591, current: 43498; changing to 45592. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45592, current: 43882; changing to 45593. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45593, current: 44266; changing to 45594. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45594, current: 44650; changing to 45595. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45595, current: 45034; changing to 45596. This may result in incorrect timestamps in the output file.
[mp4 @ 0000000000ddbfe0] Non-monotonous DTS in output stream 0:0; previous: 45596, current: 45418; changing to 45597. This may result in incorrect timestamps in the output file.

Observação: já estou definindo o timestamp de apresentação com setpts=PTS-STARTPTS , para que cada vídeo comece às 00.00. Mas como consertar este DTS não monótono? Eu estou realmente preso, por favor ajude.

Eu sei que eu poderia consertar isso com a re-codificação de vídeo durante a concatenação, mas eu realmente não posso permitir isso. Esta etapa faz parte do pipeline longo e o tempo é crucial, tenho que fazer isso com o codec de cópia.

Adicionado:

Solicitou ffprobe de saída para ambos os vídeos. Eu sei pouco sobre ffprobe output, você poderia explicar o que está acontecendo e por que há uma discrepância e o que isso significa? (512 etapas no primeiro vídeo e 384 etapas no segundo vídeo)

Middle0 (primeiro vídeo)

Middle1 (segundo vídeo)

    
por Alexey Petrenko 27.11.2016 / 17:08

2 respostas

2

Use

ffmpeg -i 0.mp4 -c:v h264_nvenc -preset fast -rc vbr -qmin 1 -qmax 1 -filter_complex "[0:v]trim=start=01.00:duration=03.00,setpts=PTS-STARTPTS[vmiddle]" -video_track_timescale 18000 -map [vmiddle] middle_0.mp4

Esses números na leitura do ffprobe são timestamps de apresentação e informam ao jogador quando exibir cada quadro. Eles são denominados em termos de uma base de tempo. Assim, um PTS de 600 com uma base de tempo de 1/1200 (ou escala de tempo de 1200), significa um tempo de exibição de 600 * 1/1200 = 0,5 segundos, assim como um PTS de 700 com uma escala de tempo de 1400. Agora, quando dois Vídeos com bases de tempo diferentes são unidos, o resultado não estará correto, pois o ffmpeg adotará a base de tempo do primeiro vídeo como o valor definitivo. Eu adicionei um parâmetro para fazer esses uniformes.

    
por 28.11.2016 / 11:46
0

De acordo com o link

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 tag adicional de -q 0, atualizei as extensões no arquivo de texto e defini meu arquivo de saída para um .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,

executou o comando concat da seguinte forma:

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

Trabalhou para mim! Você pode converter a saída final.MTS para qualquer formato que você precise.

    
por 02.12.2017 / 02:55