Alterar a taxa de quadros de um vídeo MP4 com ffmpeg

8

Eu tenho um vídeo no formato mp4 com uma taxa de quadros de .33(1 quadro por 3 segundos). Quero aumentar a taxa de quadros para 5 quadros / s. Eu tentei o comando abaixo, mas ele não faz nada:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Alguma idéia de por que o ffmpeg está ignorando a -ropção?

firemonkey
fonte
Se você estiver tentando acelerar / desacelerar um vídeo, em vez de duplicar / soltar quadros, consulte superuser.com/questions/854753/… e / ou askubuntu.com/questions/370692/…
Peter Cordes

Respostas:

7

Sei que essa é uma pergunta antiga, mas nenhuma das respostas atuais é mais recomendada.

Remuxagem sem perdas (vídeo)

Conforme observado nos comentários, há uma maneira de fazer isso onde o vídeo não precisa ser recodificado. Requer a remuxagem do arquivo para um formato MKV de contêiner diferente e, em seguida, a remuxagem novamente para um MP4. Aqui está um exemplo que altera um vídeo para 12 quadros / segundo:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Se o vídeo contém áudio também pode retardar esse baixo sem alterar o tom, mas é não uma conversão sem perdas. O exemplo abaixo supõe que o vídeo de origem tenha 24 quadros / segundo, para que o áudio precise ser reduzido para metade (0,5) da velocidade usando o filtro atempo do ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

Guia do FFMPEG Wiki

Esta é a orientação do wiki ffmpeg . Observe que todas essas opções exigem a recodificação do vídeo.

Acelerando / desacelerando o vídeo

Você pode alterar a velocidade de um fluxo de vídeo usando o filtro de vídeo setpts. Observe que nos exemplos a seguir, o fluxo de áudio não é alterado, portanto, idealmente, deve ser desativado com -an.

Para dobrar a velocidade do vídeo, você pode usar:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

O filtro funciona alterando o registro de data e hora da apresentação (PTS) de cada quadro de vídeo. Por exemplo, se houver dois quadros sucessivos mostrados nos registros de data e hora 1 e 2 e você desejar acelerar o vídeo, esses registros de data e hora deverão se tornar 0,5 e 1, respectivamente. Portanto, temos que multiplicá-los por 0,5.

Observe que esse método eliminará os quadros para atingir a velocidade desejada. Você pode evitar a queda de quadros especificando uma taxa de quadros de saída mais alta que a entrada. Por exemplo, para passar de uma entrada de 4 FPS para uma que é acelerada até 4x que (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Para diminuir a velocidade do seu vídeo, você precisa usar um multiplicador maior que 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Suave

Você pode suavizar vídeos lentos / rápidos com o filtro de vídeo minterpolar. Isso também é conhecido como "interpolação de movimento" ou "fluxo óptico".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Outras opções incluem slowmoVideo e Butterflow. Acelerar / desacelerar o áudio

Você pode acelerar ou diminuir a velocidade do áudio com o filtro de áudio atempo. Para dobrar a velocidade do áudio:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

O filtro atempo é limitado ao uso de valores entre 0,5 e 2,0 (para que ele possa diminuir a velocidade para não menos que a metade da velocidade original e acelerar para não mais que o dobro da entrada). Se necessário, você pode contornar essa limitação amarrando vários filtros atempo. O seguinte com quadruplica a velocidade do áudio:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Usando um gráfico de filtro complexo, você pode acelerar o vídeo e o áudio ao mesmo tempo:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
pseudosavant
fonte
11
É possível acelerar / diminuir a velocidade apenas remuxando, mas o FFmpeg não sabe como fazê-lo . por exemplo, para mkv, mkvtoolnix pode fazê-lo. Por exemplo, mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv altere a taxa de quadros no contêiner MKV . Você pode remuxar para o MKV e voltar para o MP4 ou encontrar uma ferramenta que faça isso para o MP4 diretamente. xcoding o vídeo é muito intensivo da CPU e com perdas, por isso é uma opção horrível.
Peter Cordes
Concordo totalmente que o remux para uma taxa de quadros menor é preferível, pois é uma abordagem sem perdas que consome muito menos recursos. Na prática, não encontrei boas ferramentas para fazer isso com os MP4s. Eu não tentei recentemente, mas quando escrevi essa resposta pela primeira vez eu estava usando o remux MP4-> MKV-> MP4 e não consegui fazê-lo funcionar usando mkvtoolnix, ffmpeg e / ou mp4box. Vou ter que tentar com os parâmetros que você sugere.
Pseudosavant
6

Se o arquivo de entrada não tiver uma taxa de quadros válida, talvez seja necessário defini-lo explicitamente

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Martin Beckett
fonte
Isso transcodifica quando você realmente precisa apenas remuxar. (A menos que você realmente deseja duplicar / largar molduras em vez de abrandar / acelerar o vídeo.)
Peter Cordes
3

Eu só poderia obter a taxa de quadros alterada para entrar em vigor se o arquivo de entrada fosse classificado como um arquivo "bruto":

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Sem especificar -f h264, o padrão seria 25 fps e não poderia ser alterado. Aparentemente, isso ocorreu porque o fluxo não possuía nenhuma informação de taxa de quadros e essa é a taxa de quadros padrão do ffmpeg.

Aparentemente, quando você usa -rcomo opção de saída, ele duplica ou baixa quadros, para que o vídeo seja reproduzido na mesma velocidade - nesse caso, não é o que você deseja! Porém, alterar a taxa de quadros da entrada como acima fará com que o vídeo acelere ou diminua, sem perda de quadros ou duplicação.

Malvineous
fonte
11
Minha resposta útil. Nenhuma recodificação aqui
yota
1

Esse recurso - de alterar a taxa de quadros - é chamado de "conformidade" e é frequentemente usado para produzir câmera lenta ou avanço rápido, como mostrar o crescimento de uma planta em minutos em instantes de dias. O ffmpeg não permite substituir / alterar a taxa de quadros sem recodificar . Se isso acontecer, a duração será alterada e o áudio ficará fora de sincronia, a menos que seja corrigido separadamente. Mas receio que o áudio não seja do seu interesse com taxa de quadros de 0,33

Você quer se conformar porque só deseja alterar a taxa de quadros, mas o ffmpeg ignora -rsilenciosamentese a taxa de quadros estiver especificada no arquivo de entrada. Como o arquivo de entrada está no formato .mp4, sua própria taxa de quadros tem precedência sobre-rquando a recodificação não for necessária. Para isso, você precisa de uma ferramenta diferente: mencoder.

Supondo que seu arquivo de entrada não contenha som - provavelmente verdadeiro para qualquer vídeo com taxa de quadros .33 - o que você precisa é:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Observe que o mencoder, por padrão, produz saída no formato AVI.

Tankman 六四
fonte
11
Isto está errado. Se rfor especificado como um comutador de saída, o ffmpeg produzirá uma saída na taxa de quadros especificada, independentemente da taxa de quadros da entrada. Se rfor especificado como um comutador de entrada, o ffmpeg duplicará ou eliminará os quadros conforme necessário para alimentar o número especificado de quadros por segundo de entrada no filtro / codificador.
Gyan
O comportamento que você descreve quando ré uma opção de entrada contradiz minha experiência anterior no formato .mp4, a nota de Malvineous (nesta página) e a descrição do bug 403 trac.ffmpeg.org/ticket/403 ; sua descrição quando rusada na saída ocorre quando recodificando, enquanto o cenário do OP parece ser um caso em conformidade (corrigir taxa de quadros sem recodificação) pelo fato de ele ter 0,33 taxa de quadros.
você precisa saber é o seguinte
11
Verifique o relatório colado aqui . Observe a linha de comando na parte superior, os metadados de entrada e saída e, finalmente, o não. de quadros codificados.
Gyan
11
Concordou que o OP quer apenas conformar o arquivo, mas o comando fornecido é recodificado, pois as opções de cópia não são especificadas. Nesse cenário, o ffmpeg deve gerar um novo fluxo em rfps.
Gyan
Obrigado Mulvya pela convincente saída de amostra. Sim, você está certo sobre o uso de -r. Esse uso não pode afetar minhas experiências anteriores em resposta ao OP, porque, considerando um caso conforme, nunca abandonei o parâmetro de cópia do ffmpeg e, -rportanto , é ignorado. I escreveu um pedido de recurso: trac.ffmpeg.org/ticket/5170
Tankman六四
0

A maneira mais rápida é criar um arquivo BAT no diretório com as seguintes linhas:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Você precisa ter mkvmerge e ffmpeg no mesmo diretório. Ele muda todos os arquivos mp4 em segundos automaticamente, sem perda de qualidade.

Peder Gerdin
fonte