Вращающиеся видео с FFmpeg - PullRequest
       16

Вращающиеся видео с FFmpeg

355 голосов
/ 15 октября 2010

Я пытался понять, как вращать видео с помощью 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 градусов было бы отличным вариантом, чтобы иметь. Куда делись опции поворота?

Ответы [ 10 ]

591 голосов
/ 05 марта 2012

Поворот на 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 , если вам нужны опции VBR.

Также возможно решениеиспользовать этот вспомогательный скрипт .

105 голосов
/ 28 июля 2015

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

ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v
80 голосов
/ 21 ноября 2010

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

 ffmpeg -i input -vf transpose=2 output

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

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

18 голосов
/ 17 апреля 2011

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

Я использую 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
14 голосов
/ 11 апреля 2014

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

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

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

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

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

11 голосов
/ 16 сентября 2011
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 

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

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

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

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

6 голосов
/ 05 сентября 2013

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

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

Произошло со мной для файла .mov с аудио aac.

3 голосов
/ 30 октября 2013

Этот скрипт, который будет выводить файлы со структурой каталогов в «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
2 голосов
/ 19 октября 2013

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

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

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

ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4
1 голос
/ 25 сентября 2011

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

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

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

...