안녕하세요 coconut입니다. 회사일을 진행하던 중 작업에 동영상 정보를 확인할 일이 생겨서 python으로 동영상을 읽어서 정보를 열람하는 것을 포스팅하게 되었습니다.


우선 동영상을 읽어올 수 있는 여러가지 파이썬 패키지 중에서 저는 PyAV를 선택하여 작업을 해보았습니다.

pip install av

설치는 위와 같이 해주면 됩니다.

설치가 안될 시에는 로그를 확인하여 아래와 같이 install dependency를 해결해 준 뒤에 설치를 해줍니다.

case of MacOS

brew install ffmpeg pkg-config


case of Ubuntu >= 18.04 LTS

# General dependencies sudo apt-get install -y python-dev pkg-config

# Library components sudo apt-get install -y \
libavformat-dev libavcodec-dev libavdevice-dev \
libavutil-dev libswscale-dev libswresample-dev libavfilter-dev

case of Ubuntu < 18.04 LTS

sudo apt install \
autoconf \
automake \
build-essential \
cmake \
libass-dev \
libfreetype6-dev \
libjpeg-dev \
libtheora-dev \
libtool \
libvorbis-dev \
libx264-dev \
pkg-config \
wget \
yasm \
zlib1g-dev

wget http://ffmpeg.org/releases/ffmpeg-3.2.tar.bz2 tar -xjf ffmpeg-3.2.tar.bz2 cd ffmpeg-3.2

./configure --disable-static --enable-shared --disable-doc

make

sudo make install

case of windows

https://ffmpeg.zeranoe.com/builds/

를 통하여 설치 후 PyAV를 설치합니다.


설치가 끝나면 제가 테스트 했던 코드를 사용하여 설명을 하겠습니다.

import av     # PyAV 임포트
from PIL import Image # Pillow 임포트

# 동영상을 임포트
container = av.open('동영상이름.mp4')
video = container.streams.video[0]

frames = container.decode(video=0)

# 프레임 단위로 동영상에서 이미지 추출
for frame in frames:
frame.to_image().save('frame-%04d.jpg' % frame.index)
# 이미지 하나 추출 뒤 포문 탈출
break

# 동영상 재생시간
time_base = video.time_base

# fps 샘플링 추출
fps = video.average_rate
print(time_base)
print(container.duration)

# 동영상 총 프레임
print(video.frames)

# 초당 프레임 계산
fps_calculate = int(str(fps).split('/')[0]) / int(str(fps).split('/')[1])
print("fps : " + str(fps_calculate))
print("movie seconds : " + str(int(video.frames) / fps_calculate))

# 동영상에서 추출한 이미지의 해상도 계산
im = Image.open('frame-0000.jpg')
width, height = im.size
print("width : " + str(width))
print("height : " + str(height))

코드상의 주석으로 설명이 가능합니다.

fps : Frames Per Second (초당 프레임 개수입니다.) – 보통 30fps

여기까지 간단하게 다뤄 보았습니다. 끝~!