본문 바로가기
Programming/python

python에서 동영상 처리하기

by 유주원 2016. 12. 13.

동영상 처리를 위해 ffmpeg이라는 괜찮은 툴이 있지만, python script와 연동시에 불편함 점이 있다.

(예를 들어 ffmpeg은 외부 모듈이기 때문에 프로그램 종료되는 시점을 정확히 알아야 된다든지의....)


그래서 찾아본 결과 moviepy라는 것이 존재했다.


http://zulko.github.io/moviepy/#


내가 하려고 하는 작업은 하나의 동영상이 입력으로 들어왔을 때 그것을 초단위로 이미지를 추출하여 해당 이미지의 객체를 인식하는 것이다.

(객체 인식 부분은 나중 포스트에...)


우선 moviepy를 사용하기 위해 moviepy를 설치하자.


(sudo) pip install moviepy


설치가 완료되었다면 아래와 같이 import를 해보자.


from moviepy.editor import *


위의 import 구문은 아마 실행이 안될 것이다. python에서 동작할 수 있는 ffmpeg을 설치해야 한다. 

아래와 같이 입력해서 ffmpeg을 설치하자. 


import imageio

imageio.plugins.ffmpeg.download()


ffmpeg 설치가 완료되었다고 뜨면 이제 moviepy를 실행하기 위한 모든 준비 작업이 완료되었다.


그리고 이제 실제로 비디오 데이터를 입력받아서 초단위로 뿌려주는 코드를 만들어 보자.


my_clip = VideoFileClip("test.mp4")


duration = int(my_clip.duration)


for i in range(0, duration):

my_clip.save_frame("picture" + str(i) + ".jpg", i)


초단위의 picture.jpg 파일이 생성이 되는 것을 확인을 할 수가 있다.


그런데 내가 하려는 궁극적인 목적이 이미지에 대한 객체를 인식하기 위함이기 때문에 아무래도 비디오 사이즈를 고정으로 정해주는 것이 수월할 것 같았다.


비디오 사이즈 수정을 위해 아래와 같이 코드를 추가하자.


from moviepy.video.fx.resize import resize


my_clip = VideoFileClip("test.mp4").resize(width=480)

....


위와 같이 코드를 수정을 하면 tostring() 어쩌구 저쩌구하는 에러 메시지가 발생한다.

그래서 찾아본 결과 아래의 github comment를 발견


https://github.com/Zulko/moviepy/issues/272


결론은 /usr/local/lib/python2.7/dist-packages/moviepy/video/fx/resize.py 를 열어서 32번 줄의 tostring()을 tobytes()로 바꾸라는 것이다.


바꾼담에 다시 import를 하고 resize 구문 코드를 동작시키니 비디오 resize가 완벽히 이루어졌다.