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

이름은 규칙적으로 해주는 것이 좋다.
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' 파일로 합쳐졌습니다!


✅ 이렇게, 편집기를 이용하는 것보다도 훨씬 빠르게 동영상을 합칠 수 있다. 동영상 편집기를 이용할 경우, 인코딩을 해야하며 내보내기 시간도 오래 걸리기 때문이다. 랜덤성을 주기 싫으면, 디폴트 True 값을 False 로 바꿔주면 되겠지? '-c', 'copy' 라는 명령어 때문에 인코딩 하지 말고 그대로 복사해서 합치기 때문에 작업 시간을 비약적으로 향상시켜준다.
‼️ 주의 : FFmpeg가 없으면 해당 소스코드가 실행되지 않는다. 공식 사이트에서 다운로드 받은 후, exe 파일을 프로젝트 안에 넣는 것을 강력히 추천한다.