Cortando e unindo arquivos de mídia usando o ffmpeg

0

Estou tentando remover um segmento (00:26:00 - 00:32:30) de um arquivo de vídeo input.mp4 .
Como não há como fazer isso diretamente usando o ffmpeg (até onde eu sei), eu estou cortando os segmentos que eu quero na saída e então concatenando-os.

Depois de pesquisar um pouco, descobri que existem duas maneiras de fazer isso:

Infelizmente, ambos os métodos estão falhando para mim.

Vou explicar os passos que realizei nos dois métodos:

1. Usando trim :

EDIT: este método funciona agora; pule para o segundo método.

Comando usado:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=00:26:00[a]; \
[0:v]trim=start=00:32:30,setpts=PTS-STARTPTS[b]; \
[a][b]concat[c]" -map [c] out.mp4

Saída de comando: Link

O arquivo de saída tem menos de 1 minuto de duração e é de apenas 6,8 MB, enquanto o arquivo de entrada foi de 900 MB.

2. Usando seek

Comando usado:

# Cut first wanted segment
ffmpeg -ss 00:00:00 -i input.mp4 -t 00:26:00 -c copy -avoid_negative_ts 1 first.mp4

# Cut second wanted segment
ffmpeg -ss 00:32:30 -i input.mp4 -c copy -avoid_negative_ts 1 second.mp4

# Combine all the wanted segments
ffmpeg -f concat -i input.txt -c copy output.mp4

onde input.txt contém:

file first.mp4
file second.mp4

Saída de comando: Link (o erro é mencionado na linha 90: input.txt: Invalid argument )

O arquivo de saída que recebo neste caso é de apenas cerca de 500 MB (o arquivo de entrada é 900 MB) e contém o primeiro vídeo + os primeiros minutos do segundo vídeo.

Detalhes do meu sistema:

  • Ubuntu 14.04

  • versão ffmpeg: Link

EDITAR:

O método 1 usando trim agora está funcionando, graças ao comentário de @Multvya sobre escrever segundos como a unidade de tempo em vez da notação HH: MM: SS como é quebrado .

Novo comando:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=duration=1500[av]; \
 [0:a]atrim=duration=1500[aa];\
 [0:v]trim=start=1980,setpts=PTS-STARTPTS[bv]; \
 [0:a]atrim=start=1980,asetpts=PTS-STARTPTS[ba];\
 [av][bv]concat[outv]; [aa][ba]concat=v=0:a=1[outa]" \
 -map [outv] -map [outa] out.mp4

Mas ainda quero saber o que há de errado com o segundo método.

    
por Anmol Singh Jaggi 11.04.2016 / 19:56

1 resposta

1

O filtro de apara não funciona com HH: MM: SS atualmente . Especifique em segundos. Esse método recodifica o vídeo, portanto, há uma redução na qualidade. Você pode especificar um valor de CRF, por exemplo -crf 20 para controlar a qualidade. Valores mais baixos produzem melhor qualidade, mas arquivos maiores. 18 a 28 é um intervalo decente para tentar.

Quanto ao segundo método, tente especificar os pontos de corte no arquivo de texto, ou seja,

file 'input.mp4'
duration 1560
file 'input.mp4'
inpoint 1980

e, em seguida, execute

ffmpeg -f concat -i input.txt -c copy -fflags +genpts -avoid_negative_ts make_zero output.mp4
    
por 12.04.2016 / 07:11