Software | FFmpeg 를 사용하여 동영상을 회전시켜 보자

|

1. Tistory


iPhone 에서 찍은 동영상을 Tistory 에 올리다 보면,

스마트폰을 분명 가로로 눕혀서 찍었는데도 불구하고 세로로 올라가는 경우가 있습니다.


포탈에서 검색해 보면,

여러 상용이나, 무료 소프트웨어에서 "회전" 시켜주는 방법이 소개됩니다.


다만,

상용은 돈을 내야 하고, 무료 소프트웨어더라도 이 "회전" 이 들어가면 유료버전을 사용하라고 뜹니다. (아놔)

"내가 이거 돈들지 않고 고쳐본다" 라는 오기가 생기더군요.




2. FFmpeg


예전 미디어 스트리밍 업무에 관여하고 있을 시,

FFmpeg 라는 command line 어플을 알게 되었습니다.


여러 상용 transcoding / encoding 소프트웨어가 시장에 나와 있지만,

입맛에 맞게 in-house 개발을 하려면 FFmpeg 밖에 답이 없어 보였습니다.


그래, FFmpeg 라면 분명 뭐가 있을꺼야 라는 생각으로 작업을 시작해 봅니다.


일단 아래 link 에서 최신판 FFmpeg 를 다운로드 받습니다.


https://www.ffmpeg.org/download.html



참고로 FFmpeg 는 update 가 잘 되는 편이라,

예전 버전을 가지고 있으면 기능을 원활하게 구현하지 못하거나 더 좋은 방식을 못쓰는 경우가 있습니다.

꼭 최신판을 받으세요.


Windows 라면, directory 를 하나 만들어서 압축을 풀어 놓습니다.


실행 파일은 bin 폴더 밑에 ffmpeg.exe 파일 입니다.

자 시작해 볼까요?


참고로, 원본 파일은 다음과 같이 80MB 의 mov 파일 입니다.
확장자가 MOV 인것은 iPhone 에서 찍은 동영상이라서 그래요.
동일한 H.254 CODEC 인 MP4 도 당연히 가능합니다.





3. 단순한 metadata 수정으로 회전시키기

회전이라는 것은, 동영상의 property 중에서 회전 부분에 들어간 인자로 인하여
Tistory 어플이 그렇게 인식하고 회전시켜버렸을 수도 있습니다.

그러니 회전 관련 metadata 를 날려주면 될 것 같네요.

관련 command 는 다음과 같습니다.
"v:0" 로 지정된 input_filename.mov 에 "rotate=0" 를 넣으라는 이야기 입니다.

동영상 자체가 16:9 비율로 찍혀 있는 (가로) 정보가 있으므로,
회전만 없애주면 되겠지요?


ffmpeg -i input_filename.mov -c copy -metadata:s:v:0 rotate=0 output_filename.mov

실제로 실행시킨 화면 입니다.



"ffmpeg.exe" 가 실행되면서 동영상 파일의 여러 property 를 보여주는데,

"rotate : 90" 로 되어 있는 것을 확인할 수 있습니다.


metadata 만 바꾸어 주는 것이므로, 실행은 바로 끝나고 화일 용량도 거의 같습니다.






4. data 자체를 실제로 회전시키고 re-encoding 하기


부제목 그대로, data 자체를 회전시키면서 재 encoding 하는 방법입니다.

실행 command line 은 다음과 같습니다.

ffmpeg -i input_filename.mov -vf "transpose=2" output_filename.mov


여기서 중요한 key 는 "transpose=X" 입니다.


0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip


원본 소스가 시계방향 90 도로 틀어져 있으므로,

옵션 2를 선택하여 시계 반대방향 90 도로 지정하였습니다.


아래는 실제 실행시킨 화면 입니다.



metadata 단순 수정과는 다르게, 여러 정보가 쏟아져 나옵니다.

이는 실제로 re-encoding 을 통하여 모든 동영상 data 를 다시 구성했기 때문이지요.


80MB 짜리 mov 파일을 랩탑에서 돌리는데, 약 3분정도 소요된것 같습니다.


encoder 도 원본은 H.264 인데,

FFmpeg 를 거치면서 Lavc57 로 변경되었습니다. 아무래도 CODEC license 문제를 피해가기 위함인 듯 하네요.


완료 파일도 20MB 로 줄어들었습니다.




줄어들어서 좋긴 하지만,

인코딩 횟수를 더하면서 동영상 화질의 열화를 가져다 줄 듯 합니다.




5. 결과


* ORIGINAL

Tistory 에 바로 올리면 이렇게, 오른쪽 90도 틀어진 상태로 올라가게 됩니다.




* METADATA 삭제

metadata 만 삭제한 버전입니다.

문제 없이 원래대로 돌아 왔죠?




* RE-ENCODING

"transpose=2" 를 사용하여 re-encoding 시킨 파일 입니다.

잘 되돌려 놓기는 했습니다만, 살~짝 위의 metadata 와 비교시 화질 열화가 있습니다.


다만, 80MB --> 20MB 로 줄이면서 거의 차이가 없는 정도이므로,

시간이 허락한다면 이렇게 해도 문제는 없겠죠? 선택은 사용자가 판단하면 될 듯 해요.





6. 그럼 180 도 회전은?


180도 회전이 필요한 동영상은 "vflip + hflip" 으로 하면 될것 같습니다.


https://ffmpeg.org/ffmpeg-filters.html


다만, 이렇게 하면 화면이 뭉개져 버립니다. 이게 FFmpeg 를 사용하는게 어려운 점인것 같아요.

(Linux 버전에서는 테스트해보지 못했습니다.)


180도 회전을 하고싶은 경우는 아래와 같은 순서로 해야 합니다.


1. rotate=0 를 먹여서 metadata 를 reset 한다. (rotate=180 이 먹지 않는다.)

2. vflip + hflip 을 이용하여 180 도 회전 효과를 낸다.


명령어는 다음과 같이 하면 됩니다.


ffmpeg.exe -i R:\White_LED.MOV -c copy -metadata:s:v:0 rotate=0 R:\out.MOV

ffmpeg.exe -i R:\Out.MOV -vf "vflip,hflip" R:\vhflip.MOV


아래는 처음 원본 source 이고, 그 다음은 "rotate=0 --> vflip + hflip" 한 결과 입니다.

우선 "rotate=0" 입니다. 상하가 그대로죠?



아래는 최종적으로 "vflip + hflip" 한 결과 입니다.



잘 되죠? :-)


화질 저하는 거의 느끼지 못할만큼 있지만, 용량은 re-encoding 을 통하여 1/4 이상 줄었습니다.






7. Reference


아래 link 는 FFmpeg 을 이용한 회전 사용법에 대해 알아본 stack overflow 입니다.


https://stackoverflow.com/questions/20664460/remove-rotate-metadata-from-mp4

https://stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg/9570992#9570992

https://stackoverflow.com/questions/15335073/can-i-set-rotation-field-for-a-video-stream-with-ffmpeg/15336581#15336581




FIN

후훗, 이제 걱정 없구만.

다 덤벼~!

And