Поворот видео с 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.