0. 개요

이전 포스트 (https://janguri.tistory.com/6) 에서, adb를 활용해 모바일의 이슈 이미지와 영상을 간편하게 확보할 수 있었다.

이번 글에서는, 확보한 영상을 효과적으로 편집하여 이슈 리포트하기 용이하게 바꾸는 방법을 소개한다.


1. FFmpeg란?

 

FFmpeg는 동영상 및 오디오를 인코딩, 디코딩, 변환, 스트리밍할 수 있는 강력한 오픈소스 멀티미디어 프레임워크.

영상 관련 작업을 할 때 자동으로 해결할 수 있고, ADB와 마찬가지로 CLI 기반이라 ADB와 통합하기 간편하다.

그리고, 오픈소스다!


2. FFmpeg 설치

ADB와 마찬가지로, FFmpeg 설치 글을 보면 쉽게 다운로드 할 수 있다.

*ffmpeg는 essentials,full 버전 두개가 있는데, 간단한 명령어만 사용하기에 essentials로도 충분한 것 같다.

혹시 심화적으로 활용할 거라면 그때가서 full 다운로드 하면 될 것 같다.

다만, 다운로드는 소스코드가 아닌 Get packages & executable files를 선택해야 한다!

좌측 하단에 있는 OS 中 선택

 

ADB와 마찬가지로 FFmpeg도

  1. FFmpeg를 OS에 맞게 설치 후 압축 해제
  2. 환경 변수 설정

을 해준 후, 명령 프롬프트(cmd) 창에서 ffmpeg를 입력해보면

이런 식으로 출력이 된다면 성공이다!


3. 압축

QA 업무를 하다보면 이슈 영상이 보통 10초에서, 길면 1분가량 확보되곤 한다.

샘플로 약 14초가량 일반적인 게임을 S24 Ultra 기종으로 녹화하자, 36 MB의 영상이 녹화되었다.

아래는 아주 간단한 ffmpeg 예시다!

ffmpeg -i Test.mp4 Output.mp4

정말 단순하게도, Test.mp4 영상을 ffmpeg에 input해서 Output.mp4로 바꿔줬다.

그런데 결과는,

위와 같이, 용량이 1/3이나 감소한 결과를 얻을 수 있었다!

그렇다면 더 압축하는 방법이 있을까?

ffmpeg에는 옵션을 넣어서 추가적인 압축 형식을 만들 수 있다.

다양한 옵션이 있지만, 아래가 가장 자주 쓰이는 예제라고 한다.

ffmpeg -i test.mp4 -vcodec libx264 -crf 28 -preset slow output2.mp4

결과를 보면,

1/6 이라는 엄청난 압축률을 구현할 수 있다!

아래는 지피티에게 물어본 압축 옵션들이다.

명령어 설명
-vf scale=1280:720 해상도를 1280x720(720p)로 축소 (화질 유지하면서 용량 절감)
-crf 28 H.264 화질 기반 압축 (값이 클수록 용량↓, 화질↓) (보통 18~28 사용)
-preset slow 압축 효율 최적화 (속도를 늦추는 대신 용량 감소) (ultrafast ~ veryslow 선택 가능)
-c:v libx264 H.264 코덱으로 압축 (높은 호환성 & 압축률)
-b:v 1000k 비디오 비트레이트를 1000kbps로 제한 (낮을수록 용량↓)
-r 24 프레임 레이트를 24fps로 변경 (프레임 수 줄여 용량↓)

체감상 -crf 옵션을 28 초과해도 약간은 뭉개지지만 내용 식별에는 무리가 없었다.

업무에 맞게 잘 테스트해보고 압축하면 용량을 효율적으로 압축시켜 공유할 수 있을 것이다.


4. 자르기

이슈 영상을 보면, 항상 시작 시간부터 끝나는 시간까지 이슈가 꽉 녹화되는 경우는 없다.

보통 시작하고 몇초 후, 그리고 끝나기 몇초 전에 이슈 상황이 녹화되곤 한다.

아래는, 아주 간단한 영상 자르기 명령어를 소개한다!

ffmpeg -i test.mp4 -ss 2 -to 10 output.mp4

-ss : 시작 초

2 : 2초부터

-to : 끝나는 초

10 : 10초까지

즉, 2초부터 10초까지의 영상을 남기고 자르겠다는 뜻.

14초의 영상이, 8초 영상으로 잘린 결과를 확인할 수 있다.

기본적으로 ffmpeg를 걸쳤기에 ffmpeg의 영상 압축 효과도 덤으로!

만약 시작 시간부터 n초동안 유지하고싶다면?

ffmpeg -i test.mp4 -ss 2 -t 8 output2.mp4

똑같은 결과가 나오는 것을 확인할 수 있다.


5. GIF로 바꾸기

또, 가끔 짧은 이슈 영상은 gif로 공유하면 편하게 이슈 리포트가 가능하다.

이슈를 받아보는 입장에서, 영상을 다운로드해서 켜는 것보다 gif파일이 이슈 리포트와 함께 나오면 보기 편하기 때문.

 

그래서 만약 gif로 그냥 변환해버리면?

ffmpeg -i output.mp4 output.gif

분명 2mb도 안되는 mp4 파일이 110mb짜리 영상이 돼버렸다......

 

이를 해결하기 위해, GPT의 도움을 받자면

ffmpeg -i output.mp4 -vf "fps=8, palettegen=max_colors=32" -y palette.png
ffmpeg -i output.mp4 -i palette.png -filter_complex "fps=8,paletteuse=dither=bayer" -b:v 1000k output.gif

위와 같은 두 줄의 코드로 실행하면 적당한 크기와 화질의 영상 파일이 palette.png와 함께 생성된다.

약 8초간의 영상을 gif파일로 변환

옵션에 대한 설명을 하자면,

옵션 설명
fps=8 프레임을 8fps로 줄여 용량 감소
palettegen=max_colors=32 GIF 색상을 32색으로 제한 (기본 256색)
paletteuse=dither=bayer 색상 품질 유지하면서 용량 압축
-b:v 1000k 비디오 비트레이트를 1000kbps로 제한하여 용량 절약

이렇다!

영상 압축처럼, 각자 테스트해보고 원하는 품질의 gif 파일을 뽑아내면 될 것 같다.


6. PNG 변환

아주 단순한 기능이다. 아래 예제를 보면

ffmpeg -i test.mp4 -vf "fps=1" %d.png

test.mp4 파일을 fps=1 단위로 쪼개서 png로 변환해준다.

이전에 -ss -to 기능을 활용해 2초부터 8초 사이의 fps=1 단위로 png로 변환해 줄수도 있다.

-vf "fps=1" 옵션은 fps=2로 변경 시 위 이미지의 2배 결과를 얻을 수 있다. 즉, 0.5초마다 사진이 찍히는 것.

조금 더 디테일하게 영상을 찍어야한다면 저 수치를 건들여 줄 수 있을것이다.

옵션을 없애도 실행은 되지만, 모든 프레임을 다 찍어버리는 탓에 꼭 fps를 명시해줘야 컴퓨터 건강에 이롭다.


7. 마침

ffmpeg 중에서도 매우 단순 기능만을 나열해봤다.

체감상 QA 업무중에는 위 4개 기능이 가장 많이 쓰였고, 그 외의 기능은 필요할때 찾아 쓰곤 했지만 딱히 저 위의 세 기능 말고는 더 쓰지는 않았었다.

이전에 사용한 adb 기능을 연계해서, 영상 녹화 이후 적절히 잘라서 이슈 리포트에 큰 도움이 되었다.

다음에는, adb와 ffmpeg 기능들을 통합하여 더욱 간편하게 사용하는 배치 스크립트 방법을 포스트하려고 한다!

+ Recent posts