Google Colaboratory로 동영상 처리 (초급편)

Google Colaboratory에서는 ffmpeg , PIL(Pillow) , Google Drive의 기능을 이용할 수 있으므로 연구용 동영상 해석/편집을 간단하게 실행할 수 있다. 로컬 머신의 머신 파워를 소비하는 일도 없고, 다른 사람과 공동 작업하거나 출력 결과를 공유하는 것도 가능해, 꽤 좋다.

사전 준비



동영상 파일을 Google 드라이브에 업로드



동영상 파일을 Google Drive에 업로드합니다. 이번에는 '내 드라이브/videoexp/SampleVideo_1280x720_5mb.mp4'라는 파일명으로 업로드했다.



이번 동영상 파일은 Sample Videos 에서 빌렸다.

Google 드라이브 마운트


from google.colab import drive
drive.mount('/content/gdrive')

ffmpeg를 사용하여 이미지로 변환



ffmpeg를 사용하여 동영상 파일에서 이미지를 추출합니다. 추출 시에는 프레임 레이트(fps)를 지정한다. fps는 목적에 따라 조정한다. 여기에서는 1fps(1초에 1프레임)를 지정하고 있다. fps가 커질수록 출력 결과는 부드럽게 되지만, 그만큼 처리의 시간과 파일 사이즈가 증대한다.
import os

src_img_dir = "/content/gdrive/My Drive/videoexp/src"

if not os.path.exists(src_img_dir):
    os.makedirs(src_img_dir)

!ffmpeg -i "/content/gdrive/My Drive/videoexp/SampleVideo_1280x720_5mb.mp4" -vf fps=1 "$src_img_dir/%04d.jpg"

추출된 이미지를 src 디렉터리에 저장합니다. Google Drive에서 src 디렉토리를 열면 추출된 이미지의 내용을 확인할 수 있다.



추출된 이미지 목록 얻기


import glob

src_files = glob.glob("{}/*.jpg".format(src_img_dir))
src_files.sort()

print(len(src_files), "image files")

한 장씩 이미지 처리



얻어진 각 프레임의 화상에 대하여, 1매씩 처리를 행한다.
여기에서는 PIL을 사용해 「화상의 오른쪽 상단에 프레임 번호를 쓴다」라고 하는 처리를 실행하고 있다.
from PIL import Image
from PIL import ImageDraw

dst_img_dir = "/content/gdrive/My Drive/videoexp/dst"
if not os.path.exists(dst_img_dir):
    os.makedirs(dst_img_dir)

for i, file in enumerate(src_files):
  im = Image.open(file)
  draw = ImageDraw.Draw(im)
  draw.text((10,10), "{0:04d}".format(i), fill="#ff0")
  dst_file = "{dir}/{index:04d}.jpg".format(dir=dst_img_dir,index=i)
  im.save(dst_file)

처리 후의 화상은 dst 디렉토리에 출력된다. 동영상으로 변환하기 전에 여기에서 처리 내용을 확인할 수 있다.



처리 후 이미지에서 동영상 만들기



마지막으로 처리 후의 이미지를 동영상으로 되돌립니다.
ffmpeg를 사용하여 처리 된 이미지가 저장되는 디렉토리 (dst)에있는 이미지에서 동영상 파일 (out.mp4)을 만듭니다.
이 때의 프레임 레이트는 동화상으로부터 화상을 추출 할 때 사용한 프레임 레이트와 일치 할 필요가있다.
!ffmpeg -framerate 1 -i "$dst_img_dir/%04d.jpg" "/content/gdrive/My Drive/videoexp/out.mp4"

좋은 웹페이지 즐겨찾기