python으로 동영상 정보 확인하기(feat. PyAV)
안녕하세요 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
여기까지 간단하게 다뤄 보았습니다. 끝~!
'Python' 카테고리의 다른 글
유용한 파이썬 문법(Useful Skill) (0) | 2020.02.24 |
---|---|
json to csv by python method call(파이썬으로 json을 csv 변환) (0) | 2019.09.06 |
Python list VS Numpy for matrix multiply (0) | 2019.06.10 |
파이썬 크롤링의 기초와 간단한 실행 (1) | 2019.06.10 |
Python을 이용한 엑셀 읽기 및 쓰기(xlrd, xlwt) (0) | 2019.06.10 |
맥북 egpu 연동(nvidia)
안녕하세요 코코넛입니다. 최근에 egpu를 구입하여 맥북에 물려서 쓰게 되었는데요,
여러시간 삽질하면서 생긴 지식을 끄적여 보았습니다.
우선 제가 사용하는 맥북프로와 egpu 환경은
MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
aorus gtx 1070 gaming box
입니다.
제가 구입한 egpu는 썬더볼트3 규격이며, 썬더볼트3를 지원하는 최근의 맥북이 있어야 연동하실 수 있습니다.
일단 들어가기에 앞서 맥북과 egpu를 연동해서 할 수 있는 것은 꽤 여러가지가 있는데요,
엔비디아 gpu가 들어간 egpu 기준으로 설명해드리겠습니다.
- 맥OS 상에서 cuda, cudnn, nvidia 웹드라이버를 통해 cuda 프로세싱을 쓸 수가 있습니다.(tensorflow 가능)
- 부트캠프에 윈도우를 설치하여 여러가지? 게임을 할 수 있습니다.
- 외에도 여러가지 그래픽카드로 가능한 여러가지 작업을 할 수가 있습니다.
저는 이 중에서 1번 사항에 해당하여 설치 및 연동을 해보게 되었는데요,
우선 맥에서 엔비디아 계열의 그래픽카드를 egpu로 사용하실 경우는 제약이 조금 따릅니다.
맥OS를 high sierra 10.13.X 에서 사용하셔야 합니다.(저도 모하비에서 다운그레이드 하려고 포맷을 ㅠㅠ…)
그리고 15인치 맥북같은 고급형에 들어가는 외장그래픽과 충돌이 날 수 있습니다.(이 부분이 까다롭습니다.)
자 이제 순서를 소개해 드리겠습니다.(맥OS가 high sierra 10.13.X가 설치되어 있다는 전제하에)
- 우선 SIP(System Integrity Protection)를 해제하셔야 합니다. 방법은 구글링 하시면 나오는데, 제 블로그에 있는 내용을 링크하겠습니다. https://buttercoconut.xyz/172/
- egpu를 냅두시고, 우선 맥북을 셋팅해줍니다. 자신의 맥OS 버전에 맞는 nvidia 웹드라이버를 다운받아서 설치를 해줍니다.(버전이 맞지 않으면 설치가 되지 않으니 맞을 것 같은 버전을 여러 종류로 다운받아서 설치하셔도 됩니다.)
- purge-wrangler, automate-eGPU 등의 여러가지의 auto-setting-scripts가 있지만 저는 purge-wrangler 추천해 드립니다.
- purge-wrangler를 설치하여, nvidia웹드라이버와 egpu를 연동할 수 있도록 합니다. https://github.com/mayankk2308/purge-wrangler

여기까지 하면 거의 다 끝났습니다.
재부팅을 하고 egpu를 연결하면 NVIDIA Driver Manager 에 들어가 보면 자신의 egpu가 인식됩니다.
%주의사항%
- 맥북이 켜져있고, egpu가 맥북에 연결이 되어 있을 경우 썬더볼트3 케이블을 usb처럼 마구 뽑으면 안됩니다.(반드시 맥북을 시스템 종료한 후 케이블을 뽑아야 합니다.)
- 외장그래픽이 들어간 고급형의 맥북의 경우는 외장그래픽과 충돌하여 블랙스크린이 나타날 수 있으니 https://egpu.io/ 포럼을 잘 확인하여 nvram 상에서 충돌이 나지 않도록 주의하여 다루도록 합니다.

추가로 cuda와 cudnn의 경우는 필요하신 경우에 설치하여 연동하실 수 있습니다.
https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/rdp/form/cudnn-download-survey
두 링크를 통해 자신의 OS에 맞는 버전을 다운받아서 설치하시면 됩니다.
여기까지 마치겠습니다.
'Mac' 카테고리의 다른 글
MeCab 및 mecab-python 설치하기(MacOS) (0) | 2019.02.06 |
---|---|
MacOS 에서 SIP(System Integrity Protection status) 해제하기 (0) | 2018.04.13 |
Python list VS Numpy for matrix multiply
Hello!! I’m Coconut~
This time, running simple test for matrix multiply with python list and python numpy
Run environment : 800 by 400 X 400 by 800 => 800 by 800
Case1: python list for loop matmul

Case2: numpy ndarray matmul

In this test, Numpy calculation is 180 times faster than python list loop calculation
If you want view this test code, move to below
# -*- coding: utf-8 -*-
import numpy as np
from datetime import datetime
# 일반적인 행렬
normal_matrix1 = [[x for x in range(1, 401)] for e in range(1, 801)]
# numpy 행렬 선언
np_mat1 = np.array(normal_matrix1)
# 행렬2
normal_matrix2 = [[x for x in range(401, 1201)] for e in range(1, 401)]
# numpy 행렬2 선언
np_mat2 = np.array(normal_matrix2)
print("1 : " + str(np_mat1) + str(np_mat1.shape))
print("2 : " + str(np_mat2) + str(np_mat2.shape))
start = datetime.now()
# print(np_test + np2_test)
print("-----------------------------------------------------------------")
mul = np.matmul(np_mat1, np_mat2)
print(str(mul) + " / dimension : " + str(mul.shape))
print("-----------------------------------------------------------------")
end = datetime.now()
# numpy 벡터연산 걸린 시간
print("numpy duration_time : " + str(end - start))
print("-----------------------------------------------------------------")
result = [[0 for x in range(1, 801)] for e in range(1, 801)]
start_normal = datetime.now()
for i in range(len(normal_matrix1)):
for j in range(len(normal_matrix2[0])):
for k in range(len(normal_matrix2)):
result[i][j] += normal_matrix1[i][k] * normal_matrix2[k][j]
end_normal = datetime.now()
# list 연산 걸린 시간
print(str(result))
print("-----------------------------------------------------------------")
print("normal calculation duration_time : " + str(end_normal - start_normal))
print("-----------------------------------------------------------------")
'Python' 카테고리의 다른 글
json to csv by python method call(파이썬으로 json을 csv 변환) (0) | 2019.09.06 |
---|---|
python으로 동영상 정보 확인하기(feat. PyAV) (0) | 2019.06.10 |
파이썬 크롤링의 기초와 간단한 실행 (1) | 2019.06.10 |
Python을 이용한 엑셀 읽기 및 쓰기(xlrd, xlwt) (0) | 2019.06.10 |
zappa를 이용한 파이썬 서버리스 구현 (0) | 2019.02.14 |