FFmpeg로 비디오를 180 ° 회전하는 방법은 무엇입니까? 회전 한 비디오가 있습니다. FFmpeg로이

녹화 할 때 180도 회전 한 비디오가 있습니다. FFmpeg로이 문제를 해결할 수 있습니까?



답변


tl; dr

ffmpeg 다음이 아닌 한 비디오를 자동으로 회전시킵니다.

  • 입력에 회전 메타 데이터가 없습니다.
  • 너는 ffmpeg너무 늙었다

회전 메타 데이터

iPhone과 같은 일부 비디오는 물리적으로 뒤집 히지 않지만 비디오 스트림 디스플레이 매트릭스 측 데이터 또는 회전 메타 데이터를 포함합니다. 일부 플레이어는 이러한 메타 데이터를 무시하고 일부는 무시합니다. 참조 ffmpeg귀하의 의견은 메타 데이터가 있는지 확인하기 위해 출력을 콘솔 :

$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees

자동 회전

ffmpeg 기존의 비디오 스트림 회전 메타 데이터에 따라 비디오를 자동으로 물리적으로 회전시킵니다.

자동 회전 기능을 사용하려면 2015 년 5 월 2 일부터 커밋 1630224가 포함 된 빌드가 필요합니다.

ffmpeg -i input.mp4 -c:a copy output.mp4

이 동작을 비활성화하려면 -noautorotate옵션을 사용하십시오 .


입력에 메타 데이터가 없거나 ffmpeg오래된 경우

비디오를 회전하려면 필터를 사용해야하고 회전 메타 데이터가 있으면 아래 예와 같이 제거해야합니다.

사용 ffmpeg하면 180 ° 회전하는 비디오 필터를 사용하는 세 가지 방법 중 선택할 수 있습니다.

hflipvflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv

transpose

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

rotate

이 필터는 임의의 각도로 회전 할 수 있으며 각도 대신 라디안을 단위로 사용합니다. 이 예는 π / 1 라디안 또는 180 ° 회전합니다.

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

대신 학위를 사용할 수 있습니다. 1 도는 π / 180 라디안과 같습니다. 따라서 45 ° 회전하려면 다음을 수행하십시오.

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

rotate필터를 사용할 때 bilinear=090으로 나눌 수있는 각도에 대해 쌍 선형 보간을 해제 (을 사용하여 ) 해야합니다 . 그렇지 않으면 흐리게 보일 수 있습니다.


노트

  • 필터링에는 인코딩이 필요합니다. 이 예제는 H.264 비디오 출력을 만듭니다. 원하는 품질을 얻는 방법에 대한 지침 은 FFmpeg H.264 비디오 인코딩 안내서 를 참조하십시오 .

  • 크로마 서브 샘플링. 내가 포함되어 format=yuv420p있기 때문에 ffmpeg(엔코더 입력에 따라 최소화하거나 크로마 서브 샘플링을 피하려고 시도 ffmpeg등 버전). 이것은 순수한 기술적 의미에서 좋은 동작이지만 대부분의 플레이어는보다 “고급”크로마 서브 샘플링 체계와 호환되지 않습니다. 이것은 사용과 동일 -pix_fmt yuv420하지만 필터 체인에 편리하게 위치합니다 .

  • 오디오를 복사하십시오. -codec:a copy옵션은 인코딩 대신 복사 (다중 mux)를 스트리밍 합니다. 비디오 만 조작하려는 경우 (다른 오디오 형식으로 변환하지 않는 한) 오디오를 다시 인코딩 할 이유가 없습니다. 인코딩 시간이 오래 걸리고 오디오 품질이 유지되므로 시간이 절약됩니다.


재생시 회전

또는 재생시 회전하고 다시 인코딩하지 않아도됩니다. ffplay자동으로 회전합니다 :

ffplay input.mp4

디스플레이 매트릭스 측 데이터 또는 회전 메타 데이터가없는 경우 필터를 사용할 수 있습니다.

ffplay -vf "hflip,vflip" -i input.mp4

… 또는 좋아하는 플레이어를 참조하십시오. VLC와 같이 사용할 가치가있는 대부분의 플레이어에는이 기능이 있습니다.


점점 ffmpeg

ffmpeg의 이전 빌드에는 필터링 기능이 포함되어 있지 않습니다. Linux, OS X 및 Windows 용 편리한 빌드를 포함한 여러 옵션에 대해서는 FFmpeg 다운로드 페이지를 참조하거나 단계별 ffmpeg 컴파일 안내서FFmpeg Wiki 를 참조하십시오 .


답변

FFMPEG 는 2015 년 v2.7 릴리스 에서 “회전”메타 데이터를 사용하여 입력 비디오 소스를 자동 회전하도록 기본 동작을 변경했습니다 .

스크립트 나 명령이 2.7 이전의 ffmpeg 릴리스에서 실행되지 않는 것을 알고있는 경우 가장 간단한 해결책은 메타 데이터를 기반으로 사용자 정의 회전을 제거하는 것입니다.

다른 경우에는 사용자 정의 회전 코드를 유지하고 -noautorotate플래그를 추가하여 미래에 대비할 수 있습니다 (이것은 여전히 ​​당시에 유지되었던 이전 버전에서 지원됨).


답변

디코딩 백엔드로 ffmpeg를 사용하는 미디어 플레이어도 모든 필터를 활용할 수 있습니다. “오프셋 및 플립”필터가있는이 스크린 샷을 참조하십시오.

또는 비디오를 다시 인코딩하려면 Stackoverflow 에서 FFmpeg로 회전 비디오를 확인하십시오 .


답변

다음은 “fixedFiles”아래의 디렉토리 구조로 파일을 출력하는 bash 스크립트입니다. iOS 비디오를 변환 및 회전하고 AVI를 트랜스 코딩합니다. 스크립트는 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

답변

나는 텍스트를 머리말로 써서 결국 찾은 해결책이 텍스트의 끝에 있음을 나타 내기 위해 이것을 편집하라는 요청을 받았다. 결국에는 비디오를 올바른 방향으로 회전시킨 두 개의 연속 ffmpeg 명령이 있습니다. 앞의 텍스트는 정보 부족으로 인해 거부 된 다른 메시지를 보았 듯이 최대한 많은 정보를 제공하기위한 것입니다. 어쨌든 나는 이것이 ffmpeg를 사용하는 다른 사람들을 돕기를 바랍니다. 그것은 ffmpeg에서 hflip과 vflip의 목적이 최소한 혼란스럽고 기대했던 것과 반대되는 것 같습니다.

merlin.mov 파일은 아이폰에서 찍은 비디오의 사본이며, 먼저 Dropbox에 업로드 한 다음 우분투를 실행하는 랩톱으로 다운로드합니다.

    $ uname -a
    Linux gazelle 3.13.0-135-generic #184-Ubuntu SMP
    Wed Oct 18 11:55:51 UTC 2017 x86_64 x86_64 x86_64
    GNU/Linux

USB를 통해 iPhone을 마운트하고 파일을 직접 복사 할 수 있었지만 작동하지 않았다는 것을 알고 있습니다. 내 랩탑은 아이폰이 연결되어 있지만 파일 시스템을 마운트하지 않았다는 것을 인식하고 내 아이폰에 랩탑을 “신뢰”하라는 프롬프트가 표시되지 않았다.

Dropbox에서 랩톱으로 복사하는 데 사용한 명령은 다음과 같습니다.

    cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
            merlin.mov

원본 파일은 비디오 1920 x 1080 코덱 HEVC / H.265 프레임 속도 30 / 초, 비트 전송률 8140 kbps, 오디오 코덱 MPEG-4 AAC 오디오 채널 스테레오, 샘플 속도 44100 Hz, 비트 전송률 85 kbps입니다. 내 아이폰에서 재생할 때, 그것은 올바른 방향이며, 소리가 동기화됩니다. 랩톱의 비디오에서 재생할 때는 가로가 거꾸로되어 있고 소리가 동기화되지 않습니다. “ffmpeg -i merlin.mov”의 부분 출력은 다음과 같습니다.

    Metadata:
    rotate          : 180
    creation_time   : 2017-11-02T14:41:55.000000Z
    handler_name    : Core Media Data Handler
    encoder         : HEVC

“ffmpeg -version”의 첫 번째 출력 행은 다음과 같습니다.

ffmpeg 버전 3.3.3 Copyright (c) 2000-2017 FFmpeg 개발자

다음은 MPEG-4 비디오 (video / mp4)로 변환하고 사운드를 동기화했지만 재생은 수직 및 수평으로 반전 된 상태입니다.

    ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4

다음은 수직으로 뒤집어 재생이 똑바로되고 사운드가 동기화되고 MPEG-4로 변환되었지만 수평으로 잘못 뒤집힌 끝을 남겼습니다 (오타가 아닙니다 .’hflip ‘을 지정했습니다).

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4

다음은 수평을 올바른 방향으로 뒤집었지만 재생을 거꾸로 두었습니다.

    ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4

다음은 전혀 효과가없는 것 같습니다.

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4

또한 superuser.com에서 찾은 명령을 기반으로 이것을 시도했습니다. 사운드를 성공적으로 동기화하고 MPEG-4로 변환했지만 가로 및 세로 방향이 모두 올바르지 않습니다.

    ffmpeg -i merlin.mov \
            -vf "rotate=PI:bilinear=0,format=yuv420p" \
            -metadata:s:v rotate=0 -codec:v libx264 \
            -codec:a copy merlinrotate.mp4

나는 또한 방향을 수정하는 측면에서 작동하지 않는 이것을 시도했다.

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

다음 2 단계 프로세스는 마침내 내가 원하는 것을 얻었습니다. 수직 및 수평 모두 플립, 사운드 동기화 및 MPEG-4로 변환 된 형식 (다시 말해서 오타가 아닙니다. 두 명령 모두에서 hflip을 사용했습니다) :

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4

답변

단계는 다음과 같습니다.

  1. 먼저 QuickTime에서 비디오 파일을여십시오. QuickTime을 먼저 시작하고“파일”로 이동 한 다음“파일 열기”로 내려갈 수 있습니다. 또는 파일 자체를 마우스 오른쪽 단추로 클릭하고 “연결 프로그램”을 선택한 다음 QuickTime을 선택하십시오.

  2. 비디오가 열리면 “편집”을 클릭하면 바로 아래에서 회전 및 뒤집기 옵션을 찾을 수 있습니다

  3. 원하는 방향을 잠그면 추가 한 새로운 변경 사항으로 비디오를 내 보내야합니다. QuickTime의 “파일”메뉴 아래에 “내보내기”옵션이 있습니다.

내보낼 파일 설정을 선택하고 “확인”을 클릭하여 내보내기를 시작합니다.

내보내기 작업이 완료되면 올바른 방향으로 저장하기로 선택한 새 파일을 찾을 수 있습니다!

이 전체 수정 작업을 완료하는 데 5 분도 걸리지 않았지만 동영상 길이에 따라 시간이 더 오래 걸리거나 짧아 질 수 있습니다.

블로그 소스


답변

ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

나를 위해 트릭을 했어. 조옮김 필터가 한 번에 180도 회전 할 가능성을 제공하지 않는 이유는 무엇인지 확실하지 않습니다. 자세한 내용 은 문서 를 확인하십시오 .