python을 이용하여 동영상 합치기

초록자두·2025년 11월 14일

개발환경구축

목록 보기
9/18
post-thumbnail

1. 문제상황 발생.

나는 포켓몬스터를 좋아하여, 도감을 설명해주는 장면을 주로 녹화하곤 했는데 그 동영상의 갯수가 134개가 되었다. 이 동영상을 하나로 합치고 싶은데, 물론 윈도우 미디어플레이어 편집기를 이용해도 되지만 난 python으로 합쳐보고 싶었다.

2. 이제 동영상을 합쳐보자.

  1. videos 폴더를 하나 만들어 파이참 프로젝트 폴더 안에 넣는다.

이름은 규칙적으로 해주는 것이 좋다.

  1. ocam_combine_videos.py 를 하나 만들어 소스코드를 작성하자.

import os
import subprocess
import sys
import random

video_folder = 'videos'
output_filename = 'merged_video_ffmpeg_shuffled.mp4'

video_files = []
for filename in os.listdir(video_folder):
    if filename.endswith(('.mp4', '.mov', '.avi', '.mkv')):
        video_files.append(os.path.join(video_folder, filename))

if not video_files:
    print(f"경고: '{video_folder}' 폴더에 합칠 동영상 파일이 없습니다.")
    sys.exit()

# 셔플 여부 설정 (디폴트: True)
shuffle_videos = True

if shuffle_videos:
    random.shuffle(video_files)
else:
    # 셔플하지 않음
    pass

print("✅ 파일 목록:")
for file in video_files:
    print(f"- {os.path.basename(file)}")

list_file_path = os.path.join(os.getcwd(), 'file_list_temp.txt')
with open(list_file_path, 'w', encoding='utf-8') as f:
    for file in video_files:
        f.write(f"file '{file.replace(os.path.sep, '/')}'\n")

print(f"\n🚀 동영상 합치기 시작! (FFmpeg 실행 중...)")

try:
    command = [
        'ffmpeg',
        '-f', 'concat',
        '-safe', '0',
        '-i', list_file_path,
        '-c', 'copy',
        output_filename
    ]

    subprocess.run(command, check=True)

    print(f"\n🎉 모든 동영상이 성공적으로 '{output_filename}' 파일로 합쳐졌습니다!")

except subprocess.CalledProcessError as e:
    print(f"\n❌ FFmpeg 실행 중 오류 발생. 코드가 {e.returncode}로 종료되었습니다.")
    print("원인: FFmpeg 실행 파일이 PATH에 없거나, 동영상 파일에 문제가 있을 수 있습니다.")
except FileNotFoundError:
    print("\n❌ 오류: 'ffmpeg' 실행 파일을 찾을 수 없습니다. 경로를 확인해 주세요.")

os.remove(list_file_path)

✅ 파일 목록:

  • w-20-4.mp4
  • w-6-1.mp4
  • w-17-1.mp4
  • w-19-1.mp4
  • w-8-2.mp4
  • w-56-2.mp4
  • w-25-1.mp4
  • w-63-3.mp4
  • w-37-3.mp4
  • w-11-1.mp4
  • w-38-1.mp4
  • w-72-3.mp4
  • w-78-2.mp4
  • w-78-1.mp4
  • w-74-1.mp4
  • w-64-3.mp4
  • w-20-8.mp4
  • w-18-1.mp4
  • w-36-2.mp4
  • w-4-2.mp4
  • w-56-3.mp4
  • w-14-1.mp4
  • w-63-2.mp4
  • w-65-1.mp4
  • w-49-1.mp4
  • w-52-2.mp4
  • w-26-2.mp4
  • w-40-1.mp4
  • w-36-1.mp4
  • w-72-2.mp4
  • w-16-1.mp4
  • w-9-2.mp4
  • w-77-2.mp4
  • w-45-1.mp4
  • w-52-1.mp4
  • w-13-2.mp4
  • w-80-3.mp4
  • w-47-1.mp4
  • w-61-1.mp4
  • w-59-1.mp4
  • w-20-6.mp4
  • w-41-1.mp4
  • w-28-2.mp4
  • w-23-2.mp4
  • w-73-2.mp4
  • w-73-1.mp4
  • w-54-1.mp4
  • w-51-3.mp4
  • w-71-2.mp4
  • w-70-1.mp4
  • w-34-2.mp4
  • w-67-1.mp4
  • w-26-1.mp4
  • w-66-1.mp4
  • w-45-2.mp4
  • w-71-1.mp4
  • w-27-2.mp4
  • w-55-3.mp4
  • w-39-1.mp4
  • w-80-1.mp4
  • w-34-1.mp4
  • w-25-2.mp4
  • w-4-1.mp4
  • w-20-7.mp4
  • w-8-1.mp4
  • w-76-3.mp4
  • w-41-2.mp4
  • w-20-2.mp4
  • w-20-9.mp4
  • w-28-1.mp4
  • w-77-3.mp4
  • w-21-3.mp4
  • w-36-3.mp4
  • w-73-3.mp4
  • w-13-1.mp4
  • w-72-1.mp4
  • w-56-1.mp4
  • w-80-2.mp4
  • w-51-2.mp4
  • w-22-1.mp4
  • w-75-1.mp4
  • w-76-1.mp4
  • w-24-1.mp4
  • w-23-1.mp4
  • w-15-1.mp4
  • w-63-1.mp4
  • w-14-2.mp4
  • w-77-1.mp4
  • w-42-3.mp4
  • w-28-4.mp4
  • w-24-2.mp4
  • w-76-2.mp4
  • w-21-2.mp4
  • w-0-2.mp4
  • w-33-2.mp4
  • w-57-1.mp4
  • w-21-1.mp4
  • w-71-3.mp4
  • w-37-1.mp4
  • w-62-1.mp4
  • w-62-2.mp4
  • w-31-2.mp4
  • w-28-3.mp4
  • w-0-1.mp4
  • w-60-2.mp4
  • w-5-1.mp4
  • w-42-2.mp4
  • w-20-5.mp4
  • w-55-1.mp4
  • w-68-2.mp4
  • w-6-2.mp4
  • w-7-1.mp4
  • w-33-1.mp4
  • w-12-1.mp4
  • w-70-2.mp4
  • w-64-1.mp4
  • w-66-2.mp4
  • w-20-1.mp4
  • w-37-2.mp4
  • w-56-4.mp4
  • w-64-2.mp4
  • w-35-1.mp4
  • w-50-1.mp4
  • w-79-1.mp4
  • w-18-2.mp4
  • w-55-2.mp4
  • w-51-1.mp4
  • w-9-1.mp4
  • w-27-1.mp4
  • w-68-1.mp4
  • w-31-1.mp4
  • w-42-1.mp4
  • w-69-1.mp4
  • w-60-1.mp4

셔플된 동영상을 확인 후, 로그를 보자.

... 생략

[out#0/mp4 @ 000001f58905ae40] video:534041KiB audio:40150KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.353293%
frame=101492 fps=35433 q=-1.0 Lsize= 576219KiB time=00:28:15.71 bitrate=2783.7kbits/s speed= 592x elapsed=0:00:02.86
🎉 모든 동영상이 성공적으로 'merged_video_ffmpeg_shuffled.mp4' 파일로 합쳐졌습니다!

  1. 합쳐진 동영상을 확인한다.

  1. 해결완료 잘 합쳐졌음을 확인했다.

✅ 이렇게, 편집기를 이용하는 것보다도 훨씬 빠르게 동영상을 합칠 수 있다. 동영상 편집기를 이용할 경우, 인코딩을 해야하며 내보내기 시간도 오래 걸리기 때문이다. 랜덤성을 주기 싫으면, 디폴트 True 값을 False 로 바꿔주면 되겠지? '-c', 'copy' 라는 명령어 때문에 인코딩 하지 말고 그대로 복사해서 합치기 때문에 작업 시간을 비약적으로 향상시켜준다.

‼️ 주의 : FFmpeg가 없으면 해당 소스코드가 실행되지 않는다. 공식 사이트에서 다운로드 받은 후, exe 파일을 프로젝트 안에 넣는 것을 강력히 추천한다.

profile
교육받고 열심히 해보려고 노력중인 30대 후반 아재

0개의 댓글