tl; dr
ffmpeg
irá rodar automaticamente o vídeo, a menos que:
- sua entrada não contém metadados rotativos
- seu
ffmpeg
é muito antigo
Metadados de rotação
Alguns vídeos, como os do iPhones, não são fisicamente invertidos, mas contêm dados do lado da matriz de exibição do fluxo de vídeo ou rotacionam metadados. Alguns jogadores ignoram esses metadados e outros não. Consulte a saída do console ffmpeg
para ver se sua entrada possui esses metadados:
$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
rotate : 180
Side data:
displaymatrix: rotation of -180.00 degrees
Autorotação
ffmpeg
irá girar o vídeo automaticamente de acordo com os metadados de rotação de fluxo de vídeo existentes.
Você precisa de uma compilação que inclua o commit 1630224, a partir de 2 de maio de 2015, para poder usar o recurso de auto-rotação.
Exemplo
ffmpeg -i input.mp4 -c:a copy output.mp4
Para desabilitar esse comportamento, use a opção -noautorotate
.
Se a entrada não contiver metadados ou se o seu ffmpeg
for antigo
Você terá que usar um filtro para girar o vídeo e, se houver metadados giratórios, ele precisará ser removido, conforme mostrado nos exemplos abaixo:
Exemplos
Usando ffmpeg
, você pode escolher entre três métodos de usar filtros de vídeo para girar 180 °.
hflip
e vflip
ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv
transpose
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
rotate
Este filtro pode girar para qualquer ângulo arbitrário e usa radianos como uma unidade em vez de graus. Este exemplo irá girar π / 1 radianos, ou 180 °:
ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
Você pode usar graus. Um grau é igual a π / 180 radianos. Então, se você quiser girar 45 °:
ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4
Ao usar o filtro rotate
, a interpolação bilinear deve ser desativada (usando bilinear=0
) para ângulos divisíveis por 90, caso contrário, pode parecer borrada.
Notas
-
A filtragem requer codificação. Esses exemplos fazem saídas de vídeo H.264. Consulte o Guia de codificação de vídeo FFmpeg H.264 para obter orientação sobre como obter a qualidade desejada.
-
Subamostragem de croma. Incluí
format=yuv420p
desde queffmpeg
tentará minimizar ou evitar subamostragem de croma (dependendo do codificador, entrada,ffmpeg
versão, etc). Este é um bom comportamento em um sentido puramente técnico, mas a maioria dos jogadores é incompatível com esquemas de subamostragem cromados mais "avançados". Isso é o mesmo que usar-pix_fmt yuv420
, mas está convenientemente localizado na cadeia de filtros . -
Copie o áudio. A opção
-codec:a copy
stream copy (re-mux) em vez de codificar. Não há motivo para recodificar o áudio se você quiser apenas manipular o vídeo (a menos que queira converter em um formato de áudio diferente). Isso economizará tempo, pois a codificação é demorada e preservará a qualidade do áudio.
Rodar durante a reprodução
Alternativamente, você pode girar durante a reprodução e evitar a recodificação. ffplay
irá rodar automaticamente:
ffplay input.mp4
Se não houver dados do lado da matriz de exibição ou girar metadados, você poderá usar filtros:
ffplay -vf "hflip,vflip" -i input.mp4
... ou se refira ao seu player favorito. A maioria dos jogadores que valem a pena usar, como o VLC, tem essa capacidade.
Obtendo ffmpeg
As versões mais antigas do ffmpeg não incluem recursos de filtragem. Veja a página Download do FFmpeg para várias opções, incluindo compilações convenientes para Linux, OS X e Windows, ou consulte o FFmpeg Wiki para guias passo-a-passo de compilação do ffmpeg .