녹화 할 때 180도 회전 한 비디오가 있습니다. FFmpeg로이 문제를 해결할 수 있습니까?
녹화 할 때 180도 회전 한 비디오가 있습니다. FFmpeg로이 문제를 해결할 수 있습니까?
답변:
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 ° 회전하는 비디오 필터를 사용하는 세 가지 방법 중 선택할 수 있습니다.
hflip
과 vflip
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=0
90으로 나눌 수있는 각도에 대해 쌍 선형 보간을 해제 (을 사용하여 ) 해야합니다 . 그렇지 않으면 흐리게 보일 수 있습니다.
필터링에는 인코딩이 필요합니다. 이 예제는 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 를 참조하십시오 .
-vf vflip
매력처럼 일했다. 그러나 다시 인코딩되었습니다. 잘 읽고 있는지 잘 모르겠습니다. -vf hflip,vflip
다시 인코딩하지 않는다고 말하고 있습니까?
ffmpeg
는 비디오 및 오디오 필터를 사용할 때 다시 인코딩해야합니다. 그러나 ffplay
두 번째 예와 같이 재생 중에 많은 필터를 활용할 수도 있습니다.
-codec:v libx264
. ffmpeg
사용자가 그것을 알아 내려고하지 않고도 동일한 인코딩을 사용할 수 있습니까 ?
디코딩 백엔드로 ffmpeg를 사용하는 미디어 플레이어도 모든 필터를 활용할 수 있습니다. "오프셋 및 플립"필터가있는이 스크린 샷을 참조하십시오.
또는 비디오를 다시 인코딩하려면 Stackoverflow 에서 FFmpeg로 회전 비디오를 확인하십시오 .
transpose
필터를 서로 연결 하여 효과를 얻을 수 있습니다 .
다음은 "fixedFiles"아래의 디렉토리 구조로 파일을 출력하는 bash 스크립트입니다. iOS 비디오를 변환 및 회전하고 AVI를 트랜스 코딩합니다. 스크립트는 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
나는 텍스트를 머리말로 써서 결국 찾은 해결책이 텍스트의 끝에 있음을 나타 내기 위해 이것을 편집하라는 요청을 받았다. 결국에는 비디오를 올바른 방향으로 회전시킨 두 개의 연속 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
단계는 다음과 같습니다.
먼저 QuickTime에서 비디오 파일을여십시오. QuickTime을 먼저 시작하고“파일”로 이동 한 다음“파일 열기”로 내려갈 수 있습니다. 또는 파일 자체를 마우스 오른쪽 단추로 클릭하고 "연결 프로그램"을 선택한 다음 QuickTime을 선택하십시오.
비디오가 열리면 "편집"을 클릭하면 바로 아래에서 회전 및 뒤집기 옵션을 찾을 수 있습니다
원하는 방향을 잠그면 추가 한 새로운 변경 사항으로 비디오를 내 보내야합니다. QuickTime의 "파일"메뉴 아래에 "내보내기"옵션이 있습니다.
내보낼 파일 설정을 선택하고 "확인"을 클릭하여 내보내기를 시작합니다.
내보내기 작업이 완료되면 올바른 방향으로 저장하기로 선택한 새 파일을 찾을 수 있습니다!
이 전체 수정 작업을 완료하는 데 5 분도 걸리지 않았지만 동영상 길이에 따라 시간이 더 오래 걸리거나 짧아 질 수 있습니다.