Поворот видео с помощью 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