동영상 편집(점프 컷)을 자동화해 보았다!

참고로 한 기사



이 기사를 참고로 했습니다.
htps : // 코 m / 메라 r / ms / 1b7819 d dbae 7 p d3c9b4

했던 일



YouTube 동영상 편집 방법 중 하나인 '점프 컷'을 자동화하기 위해 노력했습니다.
Jupyter Notebook으로 만들어 보았습니다. OS는 Mac입니다.
FFmpeg로 무음 시간을 감지하고 동영상을 잘라냅니다.
이런 식으로 할 수 있습니다. ⇒ htps: //같다. 베 / 2 2 WyXGぉ

코드


import subprocess
import os
def mk_movieList(movie_folder):
    files = os.listdir(movie_folder)
    files = [x for x in files if x[-4:] == '.mp4']  ### x[-4]'後ろ4文字目以降'
    files = [x for x in files if x[0] != '.']
    return files

def mk_starts_ends(wk_dir, movie):
    os.chdir(wk_dir)
    output = subprocess.run(["ffmpeg", "-i", movie, "-af", "silencedetect=noise=-33dB:d=0.6", "-f", "null", "-"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(output)
    s = str(output)
    lines = s.split('\\n')
    time_list =[]
    for line in lines:
        if "silencedetect" in line:
            words = line.split(" ")
            for i in range(len(words)):
                if "silence_start" in words[i]:
                    time_list.append(float(words[i+1]))
                if "silence_end" in words[i]:
                    time_list.append(float(words[i+1]))
    print(time_list)
    starts_ends = list(zip(*[iter(time_list)]*2))
    return starts_ends

def mk_jumpcut(wk_dir, movie, starts_ends):
    os.chdir(wk_dir)
    for i in range(len(starts_ends)-1):
        movie_name = movie.split(".") 
        splitfile = "./JumpCut/" + movie_name[0] + "_" + str(i) + ".mp4"
        print(splitfile)
        output = subprocess.run(["ffmpeg", "-i", movie, "-ss", str(starts_ends[i][1]), "-t", str(starts_ends[i+1][0]-starts_ends[i][1]), splitfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
movie_folder = "ここに素材動画が入っているフォルダの場所を記載してください。"

os.chdir(movie_folder)
wk_dir = os.path.abspath(".")
try:
    os.mkdir("JumpCut")
except:
    pass

movie_list = mk_movieList(movie_folder)

for movie in movie_list:
    print(movie)
    starts_ends = mk_starts_ends(wk_dir, movie)
    print(starts_ends)
    mk_jumpcut(wk_dir, movie, starts_ends)

이런 느낌이 듭니다.




코드의 "movie_folder"로 지정한 폴더 안에 JumpCut이라는 폴더가 더 있습니다 ...

이런 느낌으로 동영상이 분할됩니다. 이것을 정리하고 동영상 편집 소프트웨어에 부치 넣어 재생하면
점프 컷 동영상이 완성되었습니다! ! ! !

중요한 곳


 output = subprocess.run(["ffmpeg", "-i", movie, "-af", "silencedetect=noise=-33dB:d=0.6", "-f", "null", "-"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

 이 행이 무음 시간을 검출하는 명령을 subprocess로 돌리고 있습니다.
「silencedetect=noise=-33dB:d=0.6」로 무음 상태의 판정 기준을 결정하고 있습니다.
-33dB의 음량이 0.6초 계속되면 무음이라고 판정되는 것 같습니다.
여기의 파라미터는 동영상마다 조정이 상당히 필요하네요.
여기서, 반환하고 있는 결과를 텍스트 처리해, [무음 개시 시간, 무음 종료 시간]의 리스트를 작성해, 그것을 mk_jumpcut에 건네주어, 동영상을 잘라내고 있습니다.

가장 좋은 느낌의 사용법



무음 상태의 판정 기준을 느슨하게 하고, 장회동의 동영상으로 음성이 있는 부분을 잘라내고 싶을 때라든가,
거친 편집적으로 사용하는 것이 편리할 것 같습니다.
완성된 버전의 점프 컷을 완전히 자동화하려면 파라미터 조정이 필요합니다.

좋은 웹페이지 즐겨찾기