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

719   10  

10 ответов:

поворот на 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.

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

ты пробовал 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

ключа что вы не должны использовать переменную степени, а предопределенную переменную настройки из справочной страницы.

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) в команду, и это сработало. Полная команда была такова:

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

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

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

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

Comments

    Ничего не найдено.