3 minute read

목적

하나의 디렉터리 안에 수 많은 폴더들이 있고 그 안에 .mov 파일들이 들어 있습니다. 이 영상들의 총 길이를 알아내고 싶다면 어떻게 해야 할까요?

Environment

  • macOS Catalina
  • python 3.8
  • brew 가 깔려 있는 상태

사전 준비

brew install ffmpeg

ffmpeg 의 사용법

https://stackoverflow.com/questions/6239350/how-to-extract-duration-time-from-ffmpeg-output

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,

file.mp4 의 자리에 원하는 파일의 경로를 넣으면 파일의 재생시간이 깔끔하게 출력됩니다.

전체 코드

바로 복사해서 쓰시면 됩니다.

import glob
import subprocess
from datetime import timedelta, datetime

lengths = []


def get_length(filename):
    ffmpeg = subprocess.Popen(
        ['ffmpeg', '-i', filename],
        stderr=subprocess.PIPE
    )
    grep = subprocess.Popen(
        ['grep', 'Duration'],
        stdin=ffmpeg.stderr,
        stdout=subprocess.PIPE
    )
    awk = subprocess.Popen(
        ['awk', "{print $2}"],
        stdin=grep.stdout,
        stdout=subprocess.PIPE
    )
    trim = subprocess.Popen(
        ['tr', '-d', ','],
        stdin=awk.stdout,
        stdout=subprocess.PIPE
    )
    for line in trim.stdout:
        # 딱 첫 번째 줄만 출력.
        return line.decode('utf-8')

# root_dir needs a trailing slash (i.e. /root/dir/)
for filename in glob.iglob('/영상이 들어있는 폴더 경로/' + '**/*.mov', recursive=True):
     lengths.append(get_length(filename))


# 시간 parse
deltas = []
for elem in lengths:
    datetime = datetime.strptime(elem[:-4], '%H:%M:%S')
    delta = timedelta(hours=datetime.hour, minutes=datetime.minute, seconds=datetime.second)
    deltas.append(delta)

# sum
print(sum(deltas, timedelta(0)))

ffmpeg -i 를 실행하면 딱 “재생시간” 만 나오면 정말 좋겠지만, 당장 필요없는 정보도 많이 나옵니다. 심지어 stdout 이 아니라 stderr 로 출력을 하죠… (황당) 그래서 딱 “재생시간”만 뽑아내기 위해 후처리를 합니다.

ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,

Categories: ,

Updated:

Comments