Поворот видео с помощью 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 для всех вариантов. Запуск ffmpeg -filters показывает это:

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 градусов было бы отличным вариантом. Где варианты поворота ушли?

Ответ 1

Поверните 90 по часовой стрелке:

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

Для параметра транспонирования вы можете передать:

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 encoding guide, если хотите Варианты VBR.

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

Ответ 2

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

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

Ответ 3

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

 ffmpeg -i input -vf transpose=2 output

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

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

Ответ 4

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

Я использую 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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

Случилось со мной для некоторого файла .mov с аудио aac.

Ответ 8

Этот script, который выведет файлы со структурой каталогов в разделе "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

Ответ 9

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

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

Мне просто пришлось добавить в команду параметр (-r 65535/2733), и он сработал. Таким образом, полная команда:

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

Ответ 10

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

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

Программным способом рекомендуется использовать mencoder.

Ответ 11

Смартфон: запись видео в вертикальном формате

Хотите, чтобы отправить его на веб-сайт было 90 ° влево (против часовой стрелки, альбомный формат) хм.

ffmpeg -i input.mp4 -vf "rotate=0" output.mp4

Является ли. Я снова вернул вертикальный формат

Дебиан Бастер: ffmpeg --version ffmpeg версия 4.1.4-1 ~ deb10u1 Copyright (c) 2000-2019 разработчики FFmpeg