Поворот видео с FFmpeg

Я пытался выяснить, как вращать видео с помощью FFmpeg. Я работаю с видео iPhone, снятыми в портретном режиме. Я знаю, как определить текущие степени вращения с помощью MediaInfo (отличная библиотека, кстати), но я застрял на FFmpeg сейчас.

из того что я читал, что нужно использовать vfilter. По тому что я вижу, это должно выглядеть так:

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

однако, я не могу заставить это работать. Первый, -vfilters больше не существует, теперь это просто - vf. Во-вторых, я получаю эту ошибку:

No such filter: 'rotate'
Error opening filters!

насколько я знаю, у меня есть все варианты сборки FFmpeg. Бег!--8-->ffmpeg-фильтры показывает это:

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.

наличие опций для vflip и hflip великолепны и все такое, но они просто не доставят меня туда, куда мне нужно. Мне нужна возможность поворачивать видео на 90 градусов по самому наименьший. 270 градусов будет отличным вариантом также. Куда делись опции поворота?

10 ответов


повернуть на 90 по часовой стрелке:

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

для параметра transpose вы можете передать:

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

использовать -vf "transpose=2,transpose=2" на 180 градусов.

убедитесь, что вы используете последнюю версию ffmpeg отсюда (статическая сборка будет работать нормально).

обратите внимание, что это будет перекодировать аудио и видео части. Обычно вы можете скопировать аудио, не касаясь его, используя -c:a copy. Чтобы изменить качество видео, установите битрейт (например, с -b:v 1M) или взгляните на H. 264 руководство по кодированию если вы хотите параметры VBR.

решение также использовать это сценарий удобство.


ты пробовал transpose еще? Как (из другого ответа)

 ffmpeg -i input -vf transpose=2 output

Если вы используете старую версию, вам нужно обновить ffmpeg, если вы хотите использовать функцию транспонирования, как она была добавлена в октябре 2011 года.

FFmpeg скачать страница предлагает статические сборки, которые вы можете непосредственно выполнить без необходимости их компиляции.


Если вы не хотите перекодировать свое видео, и ваш плеер может обрабатывать метаданные вращения, вы можете просто изменить вращение в метаданных с помощью ffmpeg:

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

я наткнулся на эту страницу при поиске того же ответа. Прошло уже шесть месяцев с тех пор, как это было первоначально предложено, и сборки были обновлены много раз с тех пор. Тем не менее, я хотел добавить ответ для всех, кто встречается здесь в поисках этой информации.

Я использую Debian Squeeze и FFmpeg версия из этих репозиториев.

Man-страницу для ffmpeg гласит использовать

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

ключа что вы не должны использовать переменную степени, а предопределенную переменную настройки с 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 

не будет работать, даже с последними версиями...

надо изменить порядок:

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

работает отлично


для поворота изображения по часовой стрелке можно использовать фильтр поворота, указывающий положительный угол в радианах. При 90 градусах, приравниваемых к PI / 2, Вы можете сделать это так:

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

против часовой стрелки угол должен быть отрицательным

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

фильтр транспонирования будет работать одинаково хорошо для 90 градусов, но для других углов это более быстрый или единственный выбор.


Если вы получаете "кодек экспериментальный, но экспериментальные кодеки не включены" ошибка используйте это:

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

случилось со мной .файл mov с AAC аудио.


этот скрипт, который будет выводить файлы со структурой каталогов в разделе "fixedFiles". На данный момент фиксируется на MOV файлах и будет выполнять ряд преобразований в зависимости от исходного "вращения" видео. Работает с iOS захваченных видео на Mac под управлением Mavericks, но должен быть легко экспортируемым. Полагается на установку обоих exiftool и 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

ответ Алексея почти сработал для меня, за исключением того, что я получал эту ошибку:

timebase 1/90000 не поддерживается стандартом MPEG 4, максимум допустимое значение знаменателя временной базы-65535

Мне просто нужно было добавить параметр (- r 65535/2733) в команду, и это сработало. Полная команда была такова:--2-->

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

к сожалению, версия Ubuntu ffmpeg поддерживает видеофильтры.

вам нужно использовать avidemux или какой-либо другой редактор для достижения того же эффекта.

в программном виде был рекомендован mencoder.