FFmpeg로 비디오 회전


417

FFmpeg로 비디오를 회전시키는 방법을 알아 내려고 노력했습니다. 세로 모드로 찍은 iPhone 비디오로 작업하고 있습니다. MediaInfo (우수한 라이브러리, btw)를 사용하여 현재 회전 각도를 결정하는 방법을 알고 있지만 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.

vfliphflip에 대한 옵션을 갖는 것은 훌륭하지만 전부 내가 어디로 가야할지 알려주지 않습니다. 비디오를 최소한 90도 회전시킬 수 있어야합니다. 270 도는 훌륭한 옵션입니다. 회전 옵션은 어디로 갔습니까?


내 답변을 업데이트했습니다. 지난달 소스에 필터가 추가 된 것 같습니다.
rwilliams

76
180도 회전을 검색하는 사람 :-vf "vflip,hflip"
OrangeDog

4
jpegtran이 JPEG 이미지를 무손실 회전시킬 수있는 방법 인 비디오 디코딩 및 재 인코딩없이 이것이 달성 될 수 있는지 궁금합니다.
Mikhail T.

2
회전 플래그는 여기를 참조하십시오 : stackoverflow.com/questions/15335073/…
Davor Josipovic

1
방금 "transpose = 1, transpose = 1"이있는 180 ° 회전 된 비디오를 vimeo에 업로드했습니다. 회전 된 비디오를 재생할 수 있지만 vimeo에 의해 거부되었습니다. @OrangeDog의 접근 방식 -vf "vflip,hflip"은 매력처럼 작동합니다.
Besi

답변:


682

시계 방향으로 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) VBR 옵션을 원하는 경우 H.264 인코딩 안내서를 확인하십시오.

해결책은이 편리한 스크립트 를 사용하는 것입니다 .


8
비디오에는 여전히 방향 정보가 있으므로 이제 iPhone에서 비디오가 잘못 수정됩니다.
srcspider

25
이 명령을 사용할 때 방금 발견 한대로이 매개 변수를 사용하지 않는 한 저품질 비디오 출력을 얻습니다 -vcodec libx264. 그러나 ffmpeg로 사용할 인코딩을 찾아 볼 필요가 없다면 좋을 것입니다. 어떤 제안?
Sadi

8
Sadi와 동일한 라인을 따라 원본 비디오의 품질을 "복사"하는 방법이 있습니까?
Alec Jacobson

58
180에 사용할 수 있습니다-vf "transpose=2,transpose=2"
Alex Pliutau

23
현재의 문서에 따르면 "숫자 값은 더 이상 사용되지 않으며 기호 상수를 위해 삭제해야합니다." ffmpeg.org/ffmpeg-filters.html#transpose 따라서 cclock_flip, clock, cclock또는 clock_flip대신에 0, 1, 2또는 3.
l --marc l

149

비디오를 다시 인코딩하지 않고 플레이어에서 회전 메타 데이터를 처리 할 수있는 경우 ffmpeg를 사용하여 메타 데이터에서 회전을 변경할 수 있습니다.

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

11
ffmpeg -i input.m4v 2>&1 | grep rotate
데타

60
이것이 가장 좋은 답변입니다. 그러나 약간의 개선이 있습니다. 비디오에서 남은 메타 데이터 (예 : 날짜, 카메라)를 잃어 버리지 않도록하십시오 ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4v. 이렇게하면 입력 파일의 모든 전역 메타 데이터가 전역 메타 데이터로 복사되어 출력 파일에 복사되며 회전 메타 데이터 만 변경됩니다.
migle

11
세로 모드 비디오를 가지고 있고 표준 1920x1080을 갖도록 "UN 회전"을 원한다면을 원할 것 rotate=0입니다.
mivk

1
시도 -metadata:s:v rotate="180"했지만 작동하지 않았습니다. 작동해야합니까?
Ondra Žižka

7
재 인코딩이 필요하지 않으며 대부분의 비디오 플레이어는 메타 데이터 회전을 지원하므로 IMHO 최상의 솔루션입니다. Google 포토와 같은 클라우드 서비스도 있습니다. 그러나 ffmpeg가 반드시 원본 파일에서 모든 메타 데이터를 복사 할 필요는 없습니다. 따라서 원본 파일에서 다른 모든 메타 데이터를 복사하도록 명시 적으로 지정하는 것이 좋습니다.ffmpeg -i input.mp4 -codec copy -map_metadata 0 -metadata:s:v:0 rotate=0 output.mp4
Andreas

83

transpose아직 해봤 어 ? 같은 (다른 답변에서)

 ffmpeg -i input -vf transpose=2 output

이전 버전을 사용하는 경우 2011 년 10 월에 추가 된 조옮김 기능을 사용하려면 ffmpeg를 업데이트해야합니다.

FFmpeg 다운로드 페이지는 컴파일하지 않고도 직접 실행할 수있는 정적 빌드를 제공합니다.


1
아뇨 나는 그것이 존재하는지 몰랐다. 나는 그 기회를 줄 것이다.
jocull

조옮김 필터가 내 FFmpeg 빌드에 존재하지 않는 것 같습니다. 어떻게 추가해야합니까?
jocull

2011 년
Peter Hansen

6
승인 된 답변보다 1.5 년 전에 유용한 답변을 제공 한 것에 대해 처벌을받은 것 같습니다.
rwilliams

1
@JonasB 쉼표로 필터를 구분하십시오. 참조 stackoverflow.com/questions/6195872/...을
rwilliams

19

동일한 답변을 검색하는 동안이 페이지를 방문했습니다. 원래 요청한 지 6 개월이 지났으며 그 이후로 빌드가 여러 번 업데이트되었습니다. 그러나 나는이 정보를 찾는 다른 사람들을 위해 답변을 추가하고 싶었습니다.

해당 리포지토리에서 Debian Squeeze 및 FFmpeg 버전을 사용하고 있습니다.

ffmpeg의 MAN 페이지는 다음 용도를 나타냅니다.

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

정보에 대해서 감사드립니다! 나는 일반적으로 소스에서 빌드하는 데 문제가 있기 때문에 실제로이 작업을 수행 할 수 없었습니다. 지금 다시 작동시킬 수 있는지 알 수 있습니다.
jocull

transpose = 3으로 인해 이미지가 미러링됩니다.
Daniel Kobe

transpose = 2는 270 개의 회전 된 비디오를 미러링하지 않고 작동했습니다.
Daniel Kobe

17

그림을 시계 방향으로 회전하려면 회전 필터를 사용하여 양의 각도를 라디안으로 표시 할 수 있습니다. PI / 2와 90도를 동일하게하면 다음과 같이 할 수 있습니다.

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

시계 반대 방향으로 각도는 음수 여야합니다.

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

조옮김 필터는 90 도로 동일하게 작동하지만 다른 각도에서는 이것이 더 빠르거나 유일한 선택입니다.


2
이것은 대단하다. 나는, 라디안의 세분화 된 해상도를 얻을 수 있다는 발견 때문에 *곱셈으로 동작합니다 ffmpeg -i in.avi -vf "rotate=-8*PI/40" -q 1 out.avi (-PI / 4 = -10 * PI / 40보다 약간 적은 회전)
eqzx

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

최신 소스에서도 작동하지 않습니다 ...

순서를 변경해야합니다.

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

잘 작동합니다


필터를 잘못된 파일에 적용하고 있기 때문에 ... ffmpeg -i input.mp4 -vf "rotate = 90"output.mp4를 시도하면 작동합니다
patrick

2
" 라디안으로 표현 된 임의의 각도로 비디오를 회전하십시오 ." 문서 : ffmpeg.org/ffmpeg-filters.html#rotate 라디안 rotate=PI/2또는 rotate=90*PI/180필요
l --marc l

이것은 환상적입니다
Tessaracter

7

"코덱이 실험용이지만 실험용 코덱을 사용할 수 없습니다"오류가 발생하면 다음을 사용하십시오.

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

aac 오디오가있는 .mov 파일이 생겼습니다.


이것은 나를 위해 일한 유일한 예 였지만 품질은 끔찍하고 매우 막혔습니다. 또한 1080x1920 비디오를 352x640으로 축소했습니다. 스위치가 두 개 빠진 것 같습니다. 어떤 제안?
LOlliffe

1
@LOlliffe add-sameq
Andrew Schleifer

2
@AndrewSchleifer 감사합니다. 나는 그것을 시도했지만 ffmpeg는 나에게 되돌아 갔다 Option 'sameq' was removed. If you are looking for an option to preserve the quality (which is not what -sameq was for), use -qscale 0 or an equivalent quality factor option. Failed to set value '1' for option 'sameq': Invalid argument -qscale도 오류를 준다. Please use -q:a or -q:v, -qscale is ambiguous하지만 여전히 작동합니다.
LOlliffe

3

이 스크립트는 "fixedFiles"아래의 디렉토리 구조로 파일을 출력합니다. 현재 MOV 파일에 고정되어 있으며 비디오의 원래 "회전"에 따라 여러 변환을 실행합니다. 매버릭스를 실행하는 Mac에서 iOS 캡처 비디오와 함께 작동하지만 쉽게 내보낼 수 있어야합니다. exiftoolffmpeg를 모두 설치해야합니다 .

#!/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
아야 ... 이것은 효과가 있을지 모르지만 완벽하게 끔찍합니다. 우선, 쉘 프로그래밍의 일반적인 규칙 : 파이프에 grep, cut, awk 또는 sed가 둘 이상 필요하지 않습니다. sed 나 awk만으로 어느 grep을 할 수 있습니다. 보다 구체적으로, exiftool은 원하는 태그 만 출력하도록 요청할 수 있습니다. 따라서 회전을 필터링하는 대신 "exiftool -Rotation"만 있으면됩니다. 셋째, 가독성과 효율성을 높이기 위해 너무 많은 "평가"가 필요하지 않으며 "테스트가 ..."인 경우 $ ROTATION으로 대체해야합니다. 행운을 빕니다!
Mikhail T.

주사위 없음 : [Parsed_pad_2 @ 0x7f8b15c3a580] Input area -420:0:1500:1080 not within the padded area 0:0:1080:1080 or zero-sized\ [Parsed_pad_2 @ 0x7f8b15c3a580] Failed to configure input pad on Parsed_pad_2Error reinitializing filters!Failed to inject frame into filter network: Invalid argumentError while processing the decoded data for stream #0:0Conversion failed!
n`

2

Alexy의 대답은이 오류가 발생한다는 것을 제외하고는 거의 나를 위해 일했습니다.

타임베이스 1/90000은 MPEG 4 표준에서 지원되지 않습니다. 타임베이스 분모의 최대 허용 값은 65535입니다.

방금 명령에 매개 변수 (-r 65535/2733)를 추가해야했습니다. 따라서 전체 명령은 다음과 같습니다.

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

"NTSC 필름"프레임 속도를 찾고 있다면 24000/1001더 정확할 것입니다.
레이노

2

마지막으로 언급 한 솔루션과 다른 접근 방식을 가진 추가 솔루션은 카메라 드라이버가 v4l2 카메라 컨트롤 (매우 일반적 임)을 지원하는지 확인하는 것입니다.
터미널에 다음을 입력하십시오.

v4l2-ctl -L

카메라 드라이버가 v4l2 카메라 컨트롤을 지원하는 경우 다음과 같이 표시됩니다 (아래 목록은 카메라 드라이버가 지원하는 컨트롤에 따라 다름).

               contrast (int)    : min=0 max=255 step=1 default=0 value=0 flags=slider
             saturation (int)    : min=0 max=255 step=1 default=64 value=64 flags=slider
                    hue (int)    : min=0 max=359 step=1 default=0 value=0 flags=slider
white_balance_automatic (bool)   : default=1 value=1 flags=update
            red_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
           blue_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
               exposure (int)    : min=0 max=65535 step=1 default=0 value=885 flags=inactive, volatile
         gain_automatic (bool)   : default=1 value=1 flags=update
                   gain (int)    : min=0 max=1023 step=1 default=0 value=32 flags=inactive, volatile
        horizontal_flip (bool)   : default=0 value=0
          vertical_flip (bool)   : default=0 value=0

운이 좋으면 horizontal_flipvertical_flip을 지원합니다 .
그런 다음 horizontal_flip 을 다음과 같이 설정하면 됩니다.

v4l2-ctl --set-ctrl horizontal_flip=1

또는 vertical_flip을 사용 하여 다음을 수행하십시오.

v4l2-ctl --set-ctrl vertical_flip=1

그런 다음 비디오 장치를 호출하여 새 비디오를 캡처하면 (아래 예 참조) 비디오가 회전 / 떨어집니다.

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4

물론 기존 비디오를 처리해야하는 경우이 방법보다 원하는 방법이 아닙니다.

이 접근 방식의 장점은 이미지를 센서 수준으로 뒤집는 것이므로 드라이버의 센서가 이미 이미지를 뒤집어 놓았으므로 FFmpeg와 같은 응용 프로그램을 더 이상 불필요한 처리를 저장합니다.


v4l2에 대한 훌륭한 정보는 여기에 있습니다. 그 어떤 상황 :) 제공하는 데 도움이 경우 녹화 시간에 정확한 방향으로 회전하면 원래의 iOS 장치에서 업로드되는 동영상에 대해 질문했다 (! 와우) 분명히 바람직 :)이 거의 10 년 된 질문입니다
jocull을

저는이 커뮤니티에서 조금 새로 왔으며이 질문은 여기의 선배보다 훨씬 나이가 많습니다. 저는 이것이 좋은 질문이며 일반적인 질문이므로이 오래된 질문이 많은 FFmpeg 사용자를 계속 도울 것이라고 믿습니다.
JM

1

불행히도 ffmpeg의 Ubuntu 버전은 비디오 필터를 지원합니다.

동일한 효과를 얻으려면 avidemux 또는 다른 편집기를 사용해야합니다.

프로그래밍 방식으로 mencoder가 권장되었습니다.


1
"ffmpeg의 우분투 버전은 비디오 필터를 지원 하지 않습니다 "를 의미 했습니까 ?
user1438038

2
참고 : "FFmpeg가 Ubuntu 15.04 Vivid Vervet에서 돌아 왔습니다." 또는 우분투 용으로 컴파일 할 수 있습니다. -> trac.ffmpeg.org/wiki/CompilationGuide/ 우분투
l --marc l

avconv는 14.04에서 작동하며 정확히 동일하게 작동합니다. (그러나 이후 버전에서는 반드시 FFmpeg를 사용하십시오.)
SilverWolf-Reinstate Monica

1

스마트 폰 : 비디오를 세로 형식으로 다시 채점

웹 사이드로 보내려면 왼쪽으로 90 ° (시계 방향, 가로 형식)입니다.

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

그렇습니다. 나는 다시 세로 형식을 얻었다

데비안 버스터 : ffmpeg --version ffmpeg 버전 4.1.4-1 ~ deb10u1 Copyright (c) 2000-2019 FFmpeg 개발자

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.