맥북의 카메라로 타임랩스 동영상 만들기

in #kr-dev5 years ago

발단

어느날 문득 내가 회사에서 하루종일 어떤 자세로 일하고 있는지 궁금해졌다. 나만 궁금한가?

안드로이드 앱 개발로 먹고사니 앱으로 만들어볼까 싶었지만 카메라 API를 다루기도 귀찮고, 막상 촬영을 하려면 폰을 어딘가에 잘 고정해두고 계속 켜둬야 하는데 이것도 거추장스럽다고 판단했다. 그래, 노트북에 장식처럼 달린 카메라를 이 참에 한번 써 보자!

정보 수집

어떻게 만들 수 있을까 생각했다.

  1. 노트북 카메라로 사진을 찍는다.
  2. 1번 작업을 주기적으로, 특정 시점까지 반복한다.
  3. 1번 작업으로 만든 사진들을 모아 동영상을 만든다.

2번은 뭔가 cronjob 같은걸 쓰면 될 것 같은데 1, 3번은 다 해 보지 않은 작업이다. 열심히 구글링을 해 보니, 이미 멋진 분들이 다 만들어두셨다.

  • ImageSnap - 맥용 캠으로 사진을 찍는 커맨드라인 도구
  • ImageMagick - 이미지 조작 + 동영상 제작 도구. 워낙 유명해서 이름은 많이 들어봤다.
  • ffMpeg - 동영상 제작 도구. 역시 아주 유명한 도구이다.
  • automator - osX 기본 탑재된 스크립트 실행 도구

주기적인 반복작업은 어떻게 할까 고민을 해 봤는데, cron 을 이용할 수도 있겠지만 작업을 자주 시작하거나 중단하기엔 커맨드라인 도구보다는 GUI 도구가 더 좋다고 생각해서 osX가 기본 제공하는 automator를 사용하기로 했다.

작업을 좀 더 구체화하면 다음과 같다.

  1. imagesnap으로 사진을 찍는다.
  2. automator를 이용해 '1번 작업을 수행 - 30초 딜레이 - 다시 1번 작업 수행' 하는 반복 동작을 5시간 동안 수행한다.
  3. imageMagick이나 ffmpeg을 이용해 이미지를 동영상으로 변환한다.

작업 준비

도구는 알았으니 설치를 해야지. 모든 도구는 homebrew를 이용해 간단히 설치할 수 있다.
터미널에서 다음 명령어들을 입력하면 된다.

#1. homebrew 설치
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
#2. imagesnap 설치
brew install imagesnap
#3. imagemagick  설치
brew install imagemagick
#4. ffmpeg 설치
brew install ffmpeg
#5. rename 설치  - 아직 소개하지 않은 rename 도구
brew install rename

구현

자, 이제 진짜 구현해보자.

촬영

imagesnap은 매우 사용하기 쉽다. 그냥 imagesnap cap.jpg 이런식으로 명령만 날리면 사진이 찍힌다. 다만 이렇게 하면 사진이 시커멓게 나온다. 이는 camera warm up 때문인 듯 하다. -w 옵션을 이용해 1초 정도 기동 시간을 주면 된다. 참고로 내 경우엔 모니터에도 캠이 달려서 캠 2대가 인식되었다. 이 경우 -l 옵션을 이용해 카메라 목록을 확인한 후, -d 옵션으로 촬영할 카메라를 선택하면 된다. 촬영 포맷은 png, jpg 모두 가능한데, 나중에 ffmpeg을 이용하려면 jpg여야 하므로 처음부터 jpg로 촬영하자.

imagesnap -w 1 cam.jpg

이미지 조작

촬영은 성공했는데, 사진만을 그대로 이어붙이면 나중에 영상이 좀 밋밋하다. 그래서 사진의 오른쪽 아래에 촬영 시각을 표시해보자. 이미 imagemagick이라는 훌륭한 도구를 설치했으니 간단히(명령어가 그리 간단한진 않았지만...) 사진에 시각을 표시할 수 있다. 잘 동작하는지 꼭 직접 실행해보자.

#사진에 시각 표시
date +"%H:%M:%S" | xargs -I {} /usr/local/bin/magick cam.jpg -undercolor '#0008' -gravity SouthEast -pointsize 30 -fill grey -draw "text 30,30 '{}'" cam.jpg

나는 당시 내가 뭘 하고 있었는지도 궁금해졌다. 그래서 화면 스크린샷도 집어넣어보기로 했다. 스샷은 내장된 screencapture 커맨드라인 도구를 사용하면 된다.

/usr/sbin/screencapture screen.jpg

스크린샷은 찍었으니 이를 아까 찍은 cam.jpg 에 넣어보자. 나는 왼쪽 상단에 스크린샷을 넣었다. 스크린샷은 매우 크기가 클 수 있어서, 20% 로 축소해서 집어넣었다.

# 20% 로 축소
/usr/local/bin/magick convert screen.jpg -resize 20% screen.jpg
# cam.jpg 의 왼쪽 상단에 살짝 마진을 주어 집어넣음
/usr/local/bin/magick cam.jpg -gravity NorthWest -draw "image over 10,10 0,0 'screen.jpg'" cam.jpg

하루 종일 사진을 찍어 차곡차곡 쌓아야 하므로 촬영한 사진 파일명엔 시각을 표시하기로 한다. 이를 위해 다음과 같이 파일명을 바꾼다.

#snapshot_HH_MM_SS.jpg 로 이름 변경
date +"%H_%M_%S" | xargs -I {} mv cam.jpg snapshot_{}.jpg

자, 지금까지 한 장의 사진을 만드는 작업을 마쳤다. 이제 반복 작업을 수행해보자.

automator로 반복작업하기

osX엔 이미 automator가 다 깔려있을테니 이를 실행해보자. 실행하자마자 뭘 선택하라고 나오는데, workflow 를 선택한다.

이제 작업을 하나씩 등록해야 한다. 우리가 앞 단계에서 열심히 만든 shell script를 실행해야 하니 왼쪽 Variables 옆에 보이는 검색창에 shell 을 입력하면 나오는 Run Shell Script를 더블클릭한다.

더블클릭하면 오른쪽 영역에 스크립트를 입력하라고 나온다. 우리가 열심히 작업한 script를 집어넣자. 나의 경우 home 디렉터리 밑에 미리 snapshots 라는 디렉터리를 만들어서 여기서 작업했다.

cd ~/snapshots
/usr/local/bin/imagesnap -w 1 cam.jpg
/usr/sbin/screencapture screen.jpg
/usr/local/bin/magick convert screen.jpg -resize 20% screen.jpg
/usr/local/bin/magick cam.jpg -gravity NorthWest -draw "image over 10,10 0,0 'screen.jpg'" cam.jpg
rm screen.jpg
date +"%H:%M:%S" | xargs -I {} /usr/local/bin/magick cam.jpg -undercolor '#0008' -gravity SouthEast -pointsize 30 -fill grey -draw "text 30,30 '{}'" cam.jpg
date +"%H_%M_%S" | xargs -I {} mv cam.jpg snapshot_{}.jpg

사진을 한장 찍었으니 좀 쉬자. 검색창에 pause를 입력하면 나오는 Pause를 더블클릭하면 Run Shell Script 밑에 Pause 항목이 추가된다. 30초 쯤 쉬자.

마지막으로 이 짓을 몇시간 동안 반복하도록 설정하자. 검색창에 loop를 입력하면 나오는 Loop를 더블클릭하고, Stop after 항목에 대충 300분 정도 넣어보자. (5시간 반복)

이렇게 다 작업을 한 후, 적절한 이름으로 저장한다. 이런 모습일 것이다.
workflow

제대로 동작하는지 궁금하니 바로 Run 을 눌러서, ~/snapshot 디렉터리에 파일이 잘 쌓이는지 확인해보자.

동영상 만들기

이미지는 준비되었으니 영상을 만들어보자. ffmpeg을 쓰면 되는데, 이 경우 이미지 파일이름이 순차적인 번호 형식이어야 한다. 따라서 시간 기준 파일명을 순차 번호 기준으로 바꾸어야 한다. rename 도구를 이용하면 이 작업을 쉽게 처리할 수 있다.

우선 열심히 촬영한 원본 사진이 불의의 사고로 날아가지 않도록, snapshot 밑에 output 이라는 디렉터리를 만들고, 여기에 원본 사진들을 다 복사하자.

mkdir output
cp *.jpg output

이제 rename을 이용해 snapshot_시_분_초.jpgsnapshot_001.jpg 형식으로 바꾸자.

rename -N 001 's/.*/snapshot_$N.jpg/' *.jpg

마지막으로 이미지들만 영상으로 묶어주면 끝! ffmpeg 엔 수만가지 옵션이 있는데 아무 옵션도 안주어도 대충 잘 만들어진다. 영상을 만든 후, rec_년일.mp4 로 만들어 snapshot 디렉터리에 쌓자.

ffmpeg -i snapshot_%03d.jpg output.mp4
rm *.jpg
date +"%Y_%m_%d" | xargs -I {} mv output.mp4 ../rec_{}.mp4
cd ..
rm -rf output

위 내용은 snapshot 디렉터리에 make_video.sh 등의 이름으로 script로 저장해서 촬영이 끝나면 실행하자. 물론 실행되어야 하므로 실행 권한을 주어야 한다.

mkdir output
cp *.jpg output
cd output
rename -N 001 's/.*/snapshot_$N.jpg/' *.jpg
ffmpeg -i snapshot_%03d.jpg output.mp4
rm *.jpg
date +"%Y_%m_%d" | xargs -I {} mv output.mp4 ../rec_{}.mp4
cd ..
rm -rf output

마지막으로 영상이 잘 만들어졌다면 하루종일 찍은 snapshot 원본 jpg도 다 지우면 된다.

정리

긴 글을 정리하면 다음과 같다.

  1. automator 를 이용해 다음 script 실행
    cd ~/snapshots
    /usr/local/bin/imagesnap -w 1 cam.jpg
    /usr/sbin/screencapture screen.jpg
    /usr/local/bin/magick convert screen.jpg -resize 20% screen.jpg
    /usr/local/bin/magick cam.jpg -gravity NorthWest -draw "image over 10,10 0,0 'screen.jpg'" cam.jpg
    rm screen.jpg
    date +"%H:%M:%S" | xargs -I {} /usr/local/bin/magick cam.jpg -undercolor '#0008' -gravity SouthEast -pointsize 30 -fill 
    grey -draw "text 30,30 '{}'" cam.jpg
    date +"%H_%M_%S" | xargs -I {} mv cam.jpg snapshot_{}.jpg
    
  2. terminal에서 다음 script 실행해서 영상 제작
    mkdir output
    cp *.jpg output
    cd output
    rename -N 001 's/.*/snapshot_$N.jpg/' *.jpg
    ffmpeg -i snapshot_%03d.jpg output.mp4
    rm *.jpg
    date +"%Y_%m_%d" | xargs -I {} mv output.mp4 ../rec_{}.mp4
    cd ..
    rm -rf output
    
  3. 원본 사진 삭제
    rm *.jpg
    
Sort:  

재미있네요. 저도 제가 일하는 모습이 궁금하네요. ㅎㅎ

Congratulations @kingori2! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You got your First payout

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:

Are you a DrugWars early adopter? Benvenuto in famiglia!
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.16
TRX 0.13
JST 0.026
BTC 57396.91
ETH 2446.23
USDT 1.00
SBD 2.41