Rodar vídeos com o FFmpeg

Eu tenho tentado descobrir como rodar vídeos com o FFmpeg. Eu estou trabalhando com vídeos do iPhone no modo retrato. Eu sei como determinar os graus de rotação atuais usando o MediaInfo (excelente biblioteca, btw), mas estou preso no FFmpeg agora.

Pelo que li, o que você precisa usar é uma opção vfilter . De acordo com o que vejo, deve ficar assim:

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 

No entanto, não consigo fazer isso funcionar. Primeiro, os filtros não existem mais, agora são apenas -vf . Em segundo lugar, recebo este erro:

 No such filter: 'rotate' Error opening filters! 

Tanto quanto eu sei, eu tenho uma compilation de todas as opções do FFmpeg. Executando ffmpeg -filters mostra isso:

 Filters: anull Pass the source unchanged to the output. aspect Set the frame aspect ratio. crop Crop the input video to x:y:width:height. fifo Buffer input images and send them when they are requested. format Convert the input video to one of the specified pixel formats. hflip Horizontally flip the input video. noformat Force libavfilter not to use any of the specified pixel formats for the input to the next filter. null Pass the source unchanged to the output. pad Pad input image to width:height[:x:y[:color]] (default x and y: 0, default color: black). pixdesctest Test pixel format definitions. pixelaspect Set the pixel aspect ratio. scale Scale the input video to width:height size and/or convert the i mage format. slicify Pass the images of input video on to next video filter as multi ple slices. unsharp Sharpen or blur the input video. vflip Flip the input video vertically. buffer Buffer video frames, and make them accessible to the filterchai n. color Provide an uniformly colored input, syntax is: [color[:size[:ra te]]] nullsrc Null video source, never return images. nullsink Do absolutely nothing with the input video. 

Ter as opções de vflip e hflip é ótimo e tudo, mas elas não me levam aonde preciso ir. Eu preciso da capacidade de girar vídeos em 90 graus no mínimo. 270 graus seria uma excelente opção para ter também. Para onde foram as opções de rotação?

    Rodar 90 no sentido dos pointers do relógio:

     ffmpeg -i in.mov -vf "transpose=1" out.mov 

    Para o parâmetro de transposição, você pode passar:

     0 = 90CounterCLockwise and Vertical Flip (default) 1 = 90Clockwise 2 = 90CounterClockwise 3 = 90Clockwise and Vertical Flip 

    Use -vf "transpose=2,transpose=2" para 180 graus.

    Certifique-se de usar uma versão recente do ffmpeg daqui (uma compilation estática funcionará bem).

    Observe que isso irá recodificar as partes de áudio e vídeo. Normalmente, você pode copiar o áudio sem tocá-lo, usando -c:a copy . Para alterar a qualidade do vídeo, defina a taxa de bits (por exemplo, com -b:v 1M ) ou dê uma olhada no guia de codificação H.264, se desejar opções VBR.

    Uma solução também é usar esse script de conveniência .

    Você já tentou transpose ? Como (da outra resposta)

      ffmpeg -i input -vf transpose=2 output 

    Se você estiver usando uma versão antiga, terá que atualizar o ffmpeg se desejar usar o recurso de transposição, como foi adicionado em outubro de 2011.

    A página de download do FFmpeg oferece compilações estáticas que você pode executar diretamente sem precisar compilá-las.

    Se você não deseja recodificar seu vídeo E seu player pode manipular metadados de rotação, basta alterar a rotação nos metadados usando ffmpeg:

     ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v 

    Eu encontrei esta página enquanto procurava a mesma resposta. Agora são seis meses desde que isso foi originalmente solicitado e as compilações foram atualizadas várias vezes desde então. No entanto, queria adicionar uma resposta para qualquer outra pessoa que encontre aqui procurando essas informações.

    Eu estou usando Debian Squeeze e FFmpeg versão desses repositorys.

    A página MAN do ffmpeg indica o seguinte uso

     ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg 

    A chave é que você não deve usar uma variável de grau, mas uma variável de configuração predefinida da página MAN.

     0=90CounterCLockwise and Vertical Flip (default) 1=90Clockwise 2=90CounterClockwise 3=90Clockwise and Vertical Flip 
     ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 

    não vai funcionar, mesmo com a última fonte …

    deve mudar a ordem:

     ffmpeg -i input.mp4 -vf vflip output.mp4 

    funciona bem

    Para girar a imagem no sentido horário, você pode usar o filtro de rotação, indicando um ângulo positivo em radianos. Com 90 graus igual ao PI / 2, você pode fazer assim:

     ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4 

    para o sentido anti-horário o ângulo deve ser negativo

     ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4 

    O filtro de transposição funcionará igualmente bem em 90 graus, mas para outros ângulos essa é uma opção mais rápida ou única.

    Se você está recebendo um erro “O codec é experimental, mas os codecs experimentais não estão habilitados” use este:

     ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile 

    Aconteceu comigo por algum arquivo .mov com áudio aac.

    Este script irá gerar os arquivos com a estrutura de diretórios em “fixedFiles”. No momento é fixo para arquivos MOV e irá executar uma série de transformações, dependendo da “rotação” original do vídeo. Funciona com vídeos capturados pelo iOS em um Mac que executa o Mavericks, mas deve ser facilmente exportável. Depende de ter instalado tanto o exiftool quanto o ffmpeg .

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

    A resposta de Alexy quase funcionou para mim, exceto que eu estava recebendo este erro:

    timebase 1/90000 não suportado pelo padrão MPEG 4, o valor máximo admitido para o denominador de base de tempo é 65535

    Eu só tive que adicionar um parâmetro (-r 65535/2733) para o comando e funcionou. O comando completo foi assim:

     ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4 

    Infelizmente, a versão Ubuntu do ffmpeg suporta videofiltros.

    Você precisa usar o avidemux ou algum outro editor para obter o mesmo efeito.

    No modo programático, o mencoder foi recomendado.