0. 개요

이전 포스트 (https://janguri.tistory.com/8) 에서 ffmpeg를 이용해 영상을 효율적으로 다루게 되었다.

이번 글에서는, 이전에 만든 배치파일들을 효율적으로 통합하여 사용하는 방법을 소개한다.


1. Batch Script 통합

먼저 개인적인 경험을 소개하자면, 첫 회사에서 맨땅에 배치 스크립트를 만들면서 아래 이미지처럼 배치 스크립트가 많아져 불편한 경험이 있었다.

그래서, 최종적으로 하나의 통합 툴을 만들어 사용을 조금 더 편리하게 개선하게 되었다.

위 이미지와 같이 여러 배치 스크립트를 하나에 모아두고, 숫자를 입력 해 해당하는 행동을 하는 통합 툴을 만들어냈다.


2. 통합 방식

숫자를 입력 받으면, 여러가지 방법이 있으나 경험 상 두가지 방법을 선택해 사용했다.

  1. batch 파일을 불러(call) 실행하기
  2. 한 배치 스크립트에 모든 명령어 다 집어넣고 그 명령어 찾아가(goto) 실행하기

1번 방식의 경우, 기존에 만들었던 배치파일을 한 폴더에 다 넣고 통합 배치 스크립트에서 필요할때 불러 쓰는 방식이다.

장점으로는, 수정이 필요하면 해당 배치 파일을 꺼내 수정하면 되니 편리하다는 점.

단점으로는, 폴더 하나가 더 있어서 거슬릴 수도 있다 정도?

2번 방식의 경우, 통합 배치 스크립트에 모든 스크립트를 때려박는 방식이다.

장점으로는, 배치스크립트 단 하나만 있으면 되니 매우 깔끔하다!

단점으로는, 수정이 필요할 때 하나하나 찾아가야하니 수정이 불편하다는 점.

아래 두 코드 예시를 보면 이해가 쉬울것이다.

 

REM 1번 방식 / call로 불러들이기

@echo off
:loop
cls
chcp 65001 >nul
echo [1] capture
echo [2] record
echo [3] compress
echo [4] cut
echo [5] gif
echo [6] png
set /p num="Select number : "

if %num%==1 call batch\capture.bat
if %num%==2 call batch\record.bat
if %num%==3 call batch\compress.bat
if %num%==4 call batch\cut.bat
if %num%==5 call batch\gif.bat
if %num%==6 call batch\png.bat
goto loop

1번 방식의 스크립트다.

숫자를 입력하면, call 명령어를 통해 batch 폴더 내의 배치스크립트를 실행시키고, loop를 통해 다시 처음 위치로 이동하는 형식이다.

REM 2번 방식 //goto 명령어로 찾아가기

@echo off
:loop
cls
chcp 65001 >nul
echo [1] capture
echo [2] record
echo [3] compress
echo [4] cut
echo [5] gif
echo [6] png
set /p num="Select number : "

if %num%==1 goto capture
if %num%==2 goto record
if %num%==3 goto compress
if %num%==4 goto cut
if %num%==5 goto gif
if %num%==6 goto png
goto loop

:capture
echo this is capture script
goto loop
:record
echo this is record script
goto loop
:compress
echo this is compress script
goto loop
:cut
echo this is cut script
goto loop
:gif
echo this is gif script
goto loop
:png
echo this is png script
goto loop

2번 방식의 스크립트다.

숫자를 입력하면, goto 명령어를 통해 원하는 위치로 이동해 스크립트를 실행하고, 다시 loop 위치로 이동하는 형식이다.

 

사실 첫 선택이 중요하진 않다. 규모가 커지기 전에 알맞게 리팩토링 하면 된다. ^ㅇ^

여기서는 1번 방식 (call) 을 사용하여 불러 쓰는, 파이썬으로 치면 모듈 호출과 같은 느낌으로 만들어 보겠다.


3. 호출

우선, 아래 이미지와 같은 폴더 구조를 만들었다.

Tool.bat에서 batch\실행할스크립트.bat 을 넣어주면 끝!

이전에 만들어 둔 캡쳐 스크립트를 capture.bat에 넣어준다.

set /p file_name="Input file name : "
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png %file_name%.png

그런 후, 숫자 1을 입력해 capture.bat이 작동하는지에 대해 확인을 하면

  1. [1] capture 을 입력해서
  2. batch\capture.bat 파일이 열리고
  3. capture.bat 파일이 끝날 때 goto loop을 통해 :loop으로 이동된다.

파일은 capture.bat이 위치한 폴더에 생성되지 않고 Tool.bat에서 생성된다.

 

set /p file_name="Input file name : "
echo Recording...
echo press Ctrl + C and "N" to quit recording
adb shell screenrecord /sdcard/record.mp4
adb pull /sdcard/record.mp4 %file_name%.mp4

*화면 녹화

set /p file_name="Input file name : " 
ffmpeg -i %file_name% -vcodec libx264 -crf 28 -preset slow output_%file_name%
cls
set /p answer=Delete Original? [y/n] :
if %answer%==n goto quit
if %answer%==N goto quit
del %file_name%
ren output_%file_name% %file_name%
:quit

* 영상 압축

** Deleter Original? 을 통해 변경 전의 파일을 지우고 압축된 파일을 기존 파일명으로 변경할지의 분기점을 추가했다.

 

set /p file_name="Input file name : " 
echo enter Start time and finish time...
set /p start_time="Start time : "
set /p finish_time="Finish time : "
ffmpeg -i %file_name% -ss %start_time% -to %finish_time% output_%file_name%
set /p answer=Delete Original? [y/n]
if %answer%==n goto quit
if %answer%==N goto quit
del %file_name%
ren output_%file_name% %file_name%
:quit

* 영상 자르기

 

set /p file_name="Input file name : " 
ffmpeg -i %file_name% -vf "fps=8, palettegen=max_colors=32" -y palette.png
ffmpeg -i %file_name% -i palette.png -filter_complex "fps=8,paletteuse=dither=bayer" -b:v 1000k %file_name:~0,-4%.gif
del palette.png
:quit

* gif 만들기

**배치 파일에서 문자열 추출 규칙을 활용해, %file_name:~0,-4%로 작성하였다. (0번째부터 출력하는데 뒤에 .mp4 제거)
참고 : https://sysdocu.tistory.com/1516

 

set /p file_name="Input file name : " 
if not exist frames md frames
set /p frame_per_second=" How may Frames per second? : "
ffmpeg -i %file_name% -vf "fps=%frame_per_second%" frames/%%d.png
start frames

*png 만들기

**파일명을 입력 후, 초당 프레임을 설정할 수 있는 방식으로 구현해냈다.

*** frames 폴더가 없으면 만들고, 작업 후 frames 폴더를 자동으로 실행하게 구현했다.

 


4. 오류

명령어를 통해 생성된 파일을 삭제하거나이동할때 문제가 발생할 수도 있다.

그럴때를 대비해, adb 명령어를 재시작하는 코드를 추가했다.

if %num%==7 adb kill-server

7번을 입력했을 때 , adb kill-server을 추가해줬다.

뭐.. 다른 방법이 있을 수도 있지만 그냥 단순히 이렇게 재시작해주는 방법으로 해결했다.

 


5. 결론

말고도, 배치 스크립트를 활용하는 방법이 무궁무진하다!

예로, 아래와 같이 이쁜 색상코드를 넣을 수도 있다. (ANSI ESCAPE CODE 검색)

바로 다음으로, 배치스크립트로 병렬 실행을 (다소 억지스럽게) 구현한 방법을 소개하고자 한다.

0. 이슈 리포트 간소화를 하게 된 이유

모바일 기기에서 캡처 / 녹화 파일을 컴퓨터로 옮겨서 업로드하는 과정을 사수에게 묻자, 아래와 같은 방법을 소개받았다.

  1. 모바일 녹화, 캡처 기능 사용해 캡처
  2. 모바일 메신저를 이용해 업로드
  3. PC 메신저로 다운로드

업무 중 모바일 기기를 다뤄야 하는 건 굉장히 불편하고, 번거롭다.

따라서, 모바일 기기를 최대한 안 다루기 위해 툴을 만들었다.

그리고, 무엇보다 CMD 창에서 주르륵 업무가 되는 게 있어 보인다! (중요)

 

우선 직접 만들어 본 툴들을 순서대로 소개하고, 최종적으로 만든 배치 툴을 소개하려고 한다.

아래는 만들어서 쓴 기능들이다.

 

  1. 모바일 스크린샷 캡처 (ADB)
  2. 모바일 영상 녹화 (ADB)
  3. ADB Wi-Fi로 연결 (ADB) 
  4. 영상 압축 (FFMPEG)
  5. 영상 자르기 (FFMPEG)

또 유용한 기능이 있으면 얼마든지 추가할 계획이다.

우선 이번 포스트에서는 캡처, 녹화를 배치스크립트로 만들어 보려 한다.


1. ADB란?

ADB(Android Debug Bridge)는 안드로이드 디바이스와 PC를 연결하여 다양한 작업을 수행할 수 있도록 돕는 CLI 툴.

QA 엔지니어의 입장에서, 앱 설치 및 삭제, 로그 분석, 화면 캡처 등 테스트의 전반적인 도움을 얻을 수 있다!

특히, 여러가지 세팅 또는 테스트 과정에서 물리적인 조작을 명령어 입력으로 해결할 수 있고, 심지어 배치 스크립트를 활용해 행동을 자동화할 수 있다.

그리고, ADB는 오픈소스다!

ADB는 오픈소스 프로젝트

이번 글에서는 ADB와 배치 스크립트를 활용해 캡처/녹화하고, 이를 컴퓨터로 가지고 오는 과정을 자동화하는 간단한! 글이다.


 

2. ADB 설치

구글에 adb 설치를 검색하면 수 많은 글이 있으니, 보고 따라 하면 누구나 다운로드할 수 있다.

크게 해야 할 행동은 아래와 같다.

  1. ADB 설치해서 압축 해제
  2. 압축 해제 된 위치를 "시스템 환경 변수 편집"에 추가
  3. 휴대폰을 adb 사용 가능하게 설정 (USB 디버깅)

위 행동을 하고 나면, 명령 프롬프트(cmd) 창에서 adb devices를 입력해 보자.

실행 화면

위와 같이 실행되면 성공!

만약 연결된 디바이스가 있다면, 아래 이미지처럼 나온다.

R3CRA0JW89R => 내 단말기의 시리얼 넘버

device => 상태


3. 캡처

이제 다음과 같은 명령어를 입력해 볼 수 있다.

adb shell screencap -p /sdcard/screenshot.png

말 그대로, 스크린샷을 찍어보겠다는 의미.

스크린샷을 찍어서, /sdcard/screenshot.png  경로에 스크린샷이 저장된다.

adb pull /sdcard/screenshot.png

스크린샷을 찍으면, adb pull 명령어를 입력해 휴대폰에 저장된 스크린샷을 컴퓨터로 옮길 수 있다.

아래 이미지처럼, adb_cap/screenshot.png 와 같이 경로를 지정해도 된다. 대신 adb_cap 폴더가 있어야 함.

이미지 캡처

 

배치 스크립트를 만들어, 위 일련의 과정을 자동화할 수 있다.

아래 스크립트를 메모장에 적고, 확장자를 .bat로 바꿔서 저장하고 실행하면 빠르게 작동하는 캡처 스크립트가 완성된다.

@echo off

set /p file_name="Input file name : "

adb shell screencap -p /sdcard/screenshot.png

adb pull /sdcard/screenshot.png %file_name%.png

@echo off는 배치 스크립트가 깔끔하게 나오게 하는 기능이다. (실행 과정을 일일이 보여주는 "복창" 기능을 끄게 함)

file_name 변수에 파일명을 집어넣고,

스크린샷을 찍고,

추출할 때 %file_name% 을 이용해 png 이름을 파일명으로 저장한다.

 

📌 사용 방법

  1. 메모장에 위 스크립트 붙여 넣기 후 .bat 확장자로 저장 (adb_screenshot.bat)
  2. 배치 스크립트를 실행 (adb_screenshot.bat)
  3. 파일명을 작성 (영어로 작성)
  4. 자동으로 스크린샷 촬영 → "파일명.png" 파일이 PC로 이동

 

 

adb shell screencap -p /sdcard/screenshot.png 명령어를 반복하면, 기존 저장된 동일명의 이미지는 사라진다.

혹시 모바일 기기 용량 걱정에 직접 지우고 싶으면, 아래 명령어를 추가하면 된다.

adb shell rm /sdcard/screenshot.png

 

이제, 배치파일을 실행하고 파일명을 적는 것 만으로 자동으로 스크린숏이 저장되고, 컴퓨터로 옮길 수 있다!

 


4. 녹화

캡처가 있으면, 녹화 기능 또한 있다.

아래는 녹화 기능 명령어를 소개한다.

adb shell screenrecord /sdcard/record.mp4

해당 스크립트를 입력하면, 최대 3분까지 녹화가 된다.

중간에 Ctrl + C를 눌러 영상 녹화를 중단할 수 있다.

 

캡처와 마찬가지로, 일련의 과정을 배치 스크립트로 자동화할 수 있다.

 

@echo off

set /p file_name="Input file name : "

echo Recording...

echo press Ctrl + C and "N" to quit recording

adb shell screenrecord /sdcard/record.mp4

adb pull /sdcard/record.mp4 %file_name%.mp4

위와 유사하나, Ctrl + C를 누른 후 "N"을 입력하라는 안내 문구를 추가했다.

 

📌 사용 방법

  1. 메모장에 위 스크립트 붙여 넣기 후 .bat 확장자로 저장 (adb_screenrecord.bat)
  2. 배치 스크립트를 실행 (adb_screenrecord.bat)
  3. 파일명을 작성 (영어로 작성)
  4. 자동으로 스크린샷 촬영 → "파일명.mp4" 파일이  PC로 이동

 

배치 스크립트에서 Ctrl + C 는 스크립트 작업을 종료한다는 키

* Ctrl + C를 누르고, 위와같이 N 입력 후 Enter을 해야 스크립트가 진행된다.


5. 마침

adb 중 아주 기초적이고 단순한 기능이고, QA 업무를 조금이라도 해본 사람들이면 아마 쉽게 알 내용들이다..만!

분명 메신저로 파일을 옮기고 있을 사람들이 분명 있을 것 같아서.. 도움이 될 수도 있을 것 같아 길게 작성해 봤다!!

다음번에는, ffmpeg를 이용해 영상을 압축하고, 자르는 기능을 소개하려고 한다..!

+ Recent posts