개요

ffmpeg 라이브러리 도구를 통해 평소 우분투 터미널에서 비디오 파일의 영상 자르기, 리스케일, 코덱 분리, 이미지 시퀀스 추출 등의 작업을 간단히 수행할 수 있다. 이를 개발하는 python 프로그램 상에서 기능을 수행하기 위해 해당 ffmpeg 도구를 python 언어 상에서 돌아가게 할 수 있는 ffmpeg-python 패키지를 사용해 보았다.

테스트 환경

  • Ubuntu 20.04
  • python 3.8.18
  • ffmpeg-python 0.2.0

파이썬 패키지 설치

ffmpeg-python 패키지는 나의 작업 환경에서 pip를 통해 설치하였다.

$ pip install ffmpeg-python

작업 내용

요청받은 비디오 영상 파일에 대하여, 임의로 크기를 조정하여 파일로 저장한다. 기존 터미널 명령어를 사용하였다면 아래와 같이 사용했을 것 이다.

$ ffmpeg -i input.mp4 -vf scale={width}:{height} output.mp4

위의 내용을 python 코드로 사용하려니 레퍼런스가 부족해 초반 삽질이 조금 필요했다.

블럭 단위로 수행

중괄호와 연속적인 함수의 사용으로 간단한 명령은 아래와 같이 수행할 수 있었다.

import ffmpeg
{
  ffmpeg
  .input('input.mp4')
  .filter('scale', width, height)
  .output('output.mp4')
  .run()
}

위와 같이 실행하면 input.mp4 동영상 파일이 우리가 정한 width, height로 리스케일 되면서 output.mp4 경로에 저장이 되었는데 중대한 문제가 있다. 해당 명령어는 터미널 명령어와 유사한 구성을 가지는 것 같은데 오디오가 동영상에서 사라지는 큰 문제가 있다.

인스턴스 단위로 수행

이런 오디오 소실 문제를 해결하기 위해 다른 방식으로 라이브러리를 사용하였고. 오디오에 대한 카피 필터를 추가하여 이를 해결하였다. 내용은 아래와 같다. ffmpeg-python 관련 문서에서 일부 필터들이 영상의 오디오를 보존하지 않는 이슈가 있다고 한다(참고). 그래서 ffmpeg의 오디오 관련 필터를 찾아 그대로 복사하는 acopy 필터를 별도로 추가하였다(참고)

import ffmepg 

input_vid = ffmpeg.input('input.mp4')
video = input_vid.video.filter('scale', width, height)
audio = input_vid.audio.filter('acopy')
out = ffmpeg.output(audio, video, 'output.mp4')
out.run()

참고링크: ffmpeg - python github
참고링크: ffmpeg - filters 참고링크: ffmpeg - python documentation

Leave a comment