Como rodar um vídeo 180 ° com o FFmpeg?

56

Eu tenho um vídeo que foi girado 180 ° quando gravado. É possível corrigir isso com o FFmpeg?

    
por Louis 05.04.2013 / 08:33

7 respostas

88

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 que ffmpeg 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 .

    
por 05.04.2013 / 08:48
6

O FFMPEG alterou o comportamento padrão para girar automaticamente as fontes de vídeo de entrada com metadados de "rotação" na versão v2.7 em 2015 .

Se você souber que seu script ou comando nunca será executado em versões ffmpeg anteriores a 2.7, a solução mais simples é remover qualquer rotação personalizada com base em metadados.

Para outros casos, você pode testar o futuro mantendo seu código de rotação personalizado e adicionando o sinalizador -noautorotate (isso é suportado em versões mais antigas que ainda eram mantidas no momento).

    
por 17.06.2015 / 19:28
2

Os players de mídia que usam o ffmpeg como um backend de decodificação também podem utilizar todos os seus filtros. Veja esta imagem com o filtro "Offset & flip".

Sevocêquiserrecodificarseuvídeo,confira Como girar vídeos com o FFmpeg no Stackoverflow.

    
por 05.04.2013 / 08:47
1

A seguir, um script bash que gerará os arquivos com a estrutura de diretórios em "fixedFiles". Ele transforma e gira vídeos do iOS e transcodifica AVIs. O script depende de ter instalado tanto exiftool quanto ffmpeg .

#!/bin/bash

# rotation of 90 degrees. Will have to concatenate.
#ffmpeg -i <originalfile> -metadata:s:v:0 rotate=0 -vf "transpose=1" <destinationfile>
#/VLC -I dummy -vvv <originalfile> --sout='#transcode{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=<outputfile>}\' vlc://quit

#Allowing blanks in file names
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#Bit Rate
BR=16384

#where to store fixed files
FIXED_FILES_DIR="fixedFiles"
#rm -rf $FIXED_FILES_DIR
mkdir $FIXED_FILES_DIR

# VLC
VLC_START="/Applications/VLC.app/Contents/MacOS/VLC -I dummy -vvv"
VLC_END="vlc://quit"


#############################################
# Processing of MOV in the wrong orientation
for f in 'find . -regex '\./.*\.MOV'' 
do
  ROTATION='exiftool "$f" |grep Rotation|cut -c 35-38'
  SHORT_DIMENSION='exiftool "$f" |grep "Image Size"|cut -c 39-43|sed 's/x//''
  BITRATE_INT='exiftool "$f" |grep "Avg Bitrate"|cut -c 35-38|sed 's/\..*//''
  echo Short dimension [$SHORT_DIMENSION] $BITRATE_INT

  if test "$ROTATION" != ""; then
    DEST=$(dirname ${f})
    echo "Processing $f with rotation $ROTATION in directory $DEST"
    mkdir -p $FIXED_FILES_DIR/"$DEST"

    if test "$ROTATION" == "0"; then
      cp "$f" "$FIXED_FILES_DIR/$f"

    elif test "$ROTATION" == "180"; then
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{vfilter={rotate{angle=-"$ROTATION"}},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      $(eval ffmpeg -i \"$f\" -vf hflip,vflip -r 30 -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\")

    elif test "$ROTATION" == "270"; then
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=2,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    else
#      $(eval $VLC_START \"$f\" "--sout="\'"#transcode{scale=1,width=$SHORT_DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT_DIMENSION,height=$SHORT_DIMENSION}:rotate{angle=-"$ROTATION"}}}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
      echo ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" 
      $(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )

    fi

  fi

echo 
echo ==================================================================
sleep 1
done

#############################################
# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in 'find . -regex '\./.*\.AVI'' 
do
  DEST=$(dirname ${f})
  DEST_FILE='echo "$f" | sed 's/.AVI/.MOV/''
  mkdir -p $FIXED_FILES_DIR/"$DEST"
  echo "Processing $f in directory $DEST"
  $(eval ffmpeg -i \"$f\" -r 20 -acodec libvo_aacenc -b:a 128k -vcodec mpeg4 -b:v 8M -flags +aic+mv4 \"$FIXED_FILES_DIR/$DEST_FILE\" )
echo 
echo ==================================================================

done

IFS=$SAVEIFS
    
por 30.10.2013 / 01:09
1

Pediram-me para editar isto, para começar o texto, indicando a solução que acabei por encontrar no final do texto. Então, no final, você encontrará os dois comandos ffmpeg consecutivos que rodaram com sucesso o meu vídeo para a orientação correta. O texto anterior era para dar o máximo de informações que eu pudesse, como eu tinha visto outras mensagens que foram rejeitadas por causa da falta de informação. De qualquer forma, espero que isso ajude os outros a usar o ffmpeg. Parece-me que o propósito do hflip e do vflip no ffmpeg é, no mínimo, confuso e contrário ao que eu esperava.

O arquivo merlin.mov é uma cópia de um vídeo que tirei no meu iphone, primeiro carregado para o Dropbox, então baixado para o meu laptop, rodando o Ubuntu:

    $ uname -a
    Linux gazelle 3.13.0-135-generic #184-Ubuntu SMP
    Wed Oct 18 11:55:51 UTC 2017 x86_64 x86_64 x86_64
    GNU/Linux

Eu sei que deveria ter sido capaz de montar meu iphone via USB e copiado os arquivos diretamente, mas isso não funcionou; meu laptop reconheceria o iphone estava conectado, mas não montava seu sistema de arquivos, e Não recebi nenhuma solicitação no meu iphone para "confiar" no laptop.

O comando que usei para copiar do Dropbox para o meu laptop foi o seguinte:

    cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
            merlin.mov

O arquivo original é o Vídeo 1920 x 1080 Codec HEVC / H.265 Framerate 30 / s, bitrate 8140 kbps, canais de áudio de áudio codec MPEG-4 AAC Estéreo, taxa de amostragem 44100 Hz, taxa de bits de 85 kbps. Quando eu jogo isso meu iphone é orientado corretamente e o som é sincronizado. Quando eu o toco em Vídeos no meu laptop, estou de cabeça para baixo e invertido horizontalmente e o som não está sincronizado. Aqui está a saída parcial de "ffmpeg -i merlin.mov":

    Metadata:
    rotate          : 180
    creation_time   : 2017-11-02T14:41:55.000000Z
    handler_name    : Core Media Data Handler
    encoder         : HEVC

Aqui está a primeira linha de saída de "ffmpeg -version":

ffmpeg versão 3.3.3 Copyright (c) 2000-2017 os desenvolvedores do FFmpeg

Seguiu-se a reprodução invertida na vertical e horizontalmente, embora tenha convertido para vídeo MPEG-4 (video / mp4) e sincronizou o som:

    ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4

O seguinte inverte verticalmente para que a reprodução fique na vertical, sincronizou o som e converteu para MPEG-4, mas deixou o horizontal incorretamente invertido final para o fim (isso não é nenhum erro de digitação, Eu especifiquei 'hflip'):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4

O seguinte virou a horizontal para a orientação correta, mas deixou a reprodução de cabeça para baixo:

    ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4

O seguinte pareceu não ter efeito algum:

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4

Eu também tentei isso, com base em um comando que encontrei no superuser.com. Ele sincronizou com sucesso o som e converteu em MPEG-4, mas a orientação horizontal e vertical permaneceu incorreta:

    ffmpeg -i merlin.mov \
            -vf "rotate=PI:bilinear=0,format=yuv420p" \
            -metadata:s:v rotate=0 -codec:v libx264 \
            -codec:a copy merlinrotate.mp4

Eu também tentei isso, o que não funcionou em termos de correção a orientação:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

O seguinte processo de 2 etapas finalmente conseguiu o que eu queria; vertical e horizontal tanto invertida, som sincronizado e formato convertido para MPEG-4 (Novamente, isso não é um erro de digitação; eu usei o hflip em ambos os comandos):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
    
por 08.11.2017 / 02:40
0

Aqui estão os passos:

  1. Primeiro, abra seu arquivo de vídeo no QuickTime. Você também pode Inicie o QuickTime primeiro, vá para "Arquivo" e depois para "Abrir arquivo". Ou você pode clicar com o botão direito do mouse no próprio arquivo, escolher "Abrir com" e em seguida, escolha QuickTime.

  2. Quando o vídeo estiver aberto, clique em "Editar" e você encontrará as opções de girar e virar diretamente abaixo

  3. Depois de bloquear a orientação desejada, você tem que exportar seu vídeo com as novas alterações que você adicionou. Você vai encontre a opção "Exportar" no menu "Arquivo" no QuickTime.

Escolha as configurações do arquivo que deseja exportar e clique em "Ok" para iniciar a exportação.

Quando a operação de exportação estiver concluída, você encontrará seu novo arquivo onde quer que você tenha escolhido salvá-lo com a orientação correta!

Essa correção inteira levou menos de cinco minutos para ser concluída, mas, dependendo da duração do vídeo, pode levar muito mais tempo (ou mais curto, novamente, isso varia).

fonte do blog

    
por 20.11.2014 / 14:49
0
ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

Fez o truque para mim. Não sei por que o filtro de transposição não oferece a possibilidade de girar 180 graus de uma vez, mas seja o que for. Consulte os Docs para obter mais informações.

    
por 14.12.2016 / 10:43

Tags