Para funcionar com precisão, primeiro converta o vídeo em fluxo de bits RAW YUV (se ainda não o estiver):
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Próxima etapa: o select
filtro pega uma expressão , onde n
está o número do quadro.
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
Para ffmpeg
não duplicar os quadros, você deve forçar metade da taxa de quadros da sua entrada - para definir "2" como entrada e "1" para a saída. Não se esqueça de substituir o WxH pelas dimensões reais do seu clipe, porque o fluxo de bits bruto não possui um cabeçalho que carrega essas informações.
Em vez do acima, outra possibilidade seria adicionar o setpts
filtro para definir novos registros de data e hora para a saída. Mas tenha cuidado, pois ele solta os quadros com precisão. Aqui, 25 é a taxa de quadros de saída real desejada:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
Obviamente, você pode escolher outro formato de pixel (qualquer um ffmpeg -pix_fmts
). Certifique-se de que, ao ler o arquivo, saiba o tamanho e o formato do pixel:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …
-vf
é um apelido de-filter:v
. Não posso testá-lo agora, mas analisarei isso mais tarde quando voltar à máquina. Talvez otinterlace
filtro possa fazer o mesmo?Se o seu ffmpeg foi construído com a bandeira AviSynth, acredito que você pode passar um
.avs
arquivo.Você pode verificar executando
ffmpeg
e procurando--enable-avisynth
nos dados de configuração .Se ele está lá, você pode usá-lo assim:
ffmpeg -i blahEven.avs blahEven.yuv
.Onde
blahEven.avs
é simplesmente:Para quadros ímpares, use
SelectOdd()
.Para um uso mais avançado, consulte a documentação do SelectEvery .
fonte
--enable-avisynth
existisse, significava que o AviSynth foi incorporado ao ffmpeg, mas não tenho certeza disso.