Como definir o deslocamento do final de um arquivo mp4 usando o ffmpeg?

1

Quando eu tenho um arquivo de vídeo MP4 que dura duas horas e quero remover 30 segundos do início e 1 minuto do fim, eu uso ffmpeg desse jeito.

ffmpeg -ss 30 video.mp4 -c copy -t 1:58:30 output.mp4

Funciona bem. Mas devo calcular o comprimento do vídeo de saída. Existe uma opção para cortar o tempo específico do final de um arquivo de vídeo?

Eu quero escrever assim.

ffmpeg -ss 30 video.mp4 -c copy --offset-from-last 1:00 output.mp4
    
por ironsand 01.08.2017 / 22:00

2 respostas

2

Não existe essa opção no ffmpeg.

Você precisa analisar a duração usando ffprobe e, em seguida, calcular o deslocamento necessário usando um script. Para obter a duração total:

ffprobe -loglevel error input.mp4 \
-show_format -show_entries format=duration -of compact=p=0:nk=1

Isso mostra a saída em s.msec . Você também pode usar a opção -sexagesimal para imprimir HH:MM:SS.msec , mas isso dificulta o cálculo do seu deslocamento.

Script bash simples para fazer isso:

#!/bin/bash
input=/path/to/your/file.mp4
start="30"
offset="60"
duration="$(ffprobe -loglevel error "$input" -show_format -show_entries format=duration -of compact=p=0:nk=1)"
end=$(echo "$duration - $offset" | bc)
echo ffmpeg -ss "$start" -i "$input" -c copy -to "$end"

Observe que você deseja -to em vez de -t . O primeiro cortará o fluxo até o ponto especificado, enquanto que com -t , você terminará com um fluxo do tamanho especificado .

    
por 01.08.2017 / 22:08
0

A questão dos quadros-chave pode levar à imprecisão e não funciona com os fluxos de legendas, mas isso funciona para mim.

ffmpeg -ss 30 -i in.mp4 -itsoffset -90 -i in.mp4 -c copy -map 1:a:0 -map 0 -shortest inter.mp4

e depois

ffmpeg -i inter.mp4 -c copy -map 0 -map -0:0 final.mp4

-ss 30 é o trim inicial. -itsoffset -90 é o início e o final do corte.

    
por 01.08.2017 / 22:34

Tags