| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- null오류
- lambda
- 파이썬이미지
- 도커컨테이너
- 옵셔널체이닝
- 파이참
- 파이썬영상
- VPC
- 파이썬
- ffmpeg
- 생성형AI
- EC2
- Python
- moviepy2
- 파이썬영상편집
- mysql성능
- LLM
- moviepy
- 영상자동화
- ffprobe
- agentic
- delete비교
- EKS
- subprocess
- 노드그룹
- docker
- vivecoding
- efs
- truncate비교
- AWS
- Today
- Total
씩씩한 개발자
파이썬에서 FFmpeg 실행 시 Timeout 오류 해결 방법 본문

안녕하세요. 씩씩한 개발자입니다 ㅎㅎ!!
오늘은 파이썬에서 FFmpeg을 사용하다가 마주한 오류 (Timeout) 를 해결한 방법에 대해 포스팅하려고 합니다.
이전 글에서는 당연하게 작성하긴 했는데, 사실 파이썬에서 ffmpeg을 처음 사용할 때 그냥 pip install ffmpeg 하면 되는 줄 알았는데... 그건 그저 파이썬 wrapper 패키지일 뿐이고, 실제로는 ffmpeg 실행 파일 자체가 필요하더라고요.
여기서 ffmpeg 실행파일 설치하는 방식을 다루었습니다.
설치가 안되어 있으신 분들은 이 글을 먼저 보고 와주세요~!
https://strongdev.tistory.com/7
FFmpeg, FFprobe 설치하기
파이썬에서 영상, 음성 파일을 다루다보면 꼭 필요한 것이 ffmepg이에요. 단순히 파이썬 터미널에서 pip install ffmpeg을 한다고 설치가 되는 것이 아닙니다. 컴퓨터에 진짜 ffmpeg 실행파일인 ffmpeg.exe
strongdev.tistory.com
설치한 후에는 subprocess를 사용해서 ffmpeg을 실행하면 됩니다.
그런데.............!!
subprocess.run()으로 ffmpeg을 실행하다가보니.. 영상이 조금만 길어져도 아무 응답 없이 멈추는 현상이 계속 발생했어요...
1. subprocess 가 무엇인지,
2. 왜 timeout오류가 발생하는지,
3. 어떻게 해결했는지 말씀드릴게요!
1. subprocess란 무엇일까?
전 사실 ffmpeg을 처음 쓰면서 subprocess란 라이브러리에 대해서 알게 됐어요.
subprocess는 파이썬에서 외부 명령어를 실행할 수 있게 도와주는 표준 라이브러리입니다.
쉽게 말해 파이썬 코드에서 터미널 명령어를 실행하고, 그 결과를 받아오거나, 에러를 캐치할 수 있게 줍니다.
대표적인 함수는,
subprocess.run(): 명령어를 실행하고 결과를 기다린 후 반환 (Python 3.5 이상)subprocess.Popen(): 실행한 프로세스를 더 세밀하게 제어할 수 있음 (stdout, timeout 등)
문제는 이 subprocess가 ffmpeg처럼 오래 걸리는 명령어에선 쉽게 hang 상태(응답 없음)에 빠진다는 점입니다.
2. suprocess 오류 발생 : timeout
실행 코드:
subprocess.run(['ffmpeg', '-i', 'input.mp4', 'output.mp4'], timeout=10)
그런데 영상 길이가 조금만 길어지면... 바로 아래와 같은 에러가 뜹니다.
subprocess.TimeoutExpired: Command '['ffmpeg', '-i', 'input.mp4', ...]' timed out after 10 seconds
처음엔 timeout 값이 짧아서 그런 줄 알고 60, 120, 180초로 늘려봤는데...
이번엔 아예 아무 에러도 없이 멈춰 있는 상태가 발생하더라고요. 하하..ㅎㅎ
3. subprocess.run()을 쓸 때의 문제
result = subprocess.run(
['ffmpeg', '-i', 'input.mp4', 'output.mp4'],
timeout=60,
capture_output=True,
text=True
)
capture_output=True나 stdout=subprocess.PIPE 설정을 하면, 출력 결과도 받을 수 있어요.
그런데 만약, ffmpeg의 로그가 너무 길어지면 이 버퍼가 가득 차서 아예 멈춰버립니다.
게다가 timeout으로 종료되면 중간에 출력되던 stderr 로그도 안남기도 합니다.
4. 해결 방법 : subprocess.Popen + Timer
결국 subprocess.run() 대신 Popen을 쓰고, Timer로 강제 종료 타이밍을 제어하는 방식으로 바꿨어요.
import subprocess
import threading
def run_ffmpeg(cmd, timeout=120):
try:
proc = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
timer = threading.Timer(timeout, proc.kill)
timer.start()
stdout, stderr = proc.communicate()
timer.cancel()
return stdout, stderr
except subprocess.TimeoutExpired:
return None, "⛔ FFmpeg 실행이 제한 시간 초과로 종료되었습니다."
이 방식으로 바꾸면,
- FFmpeg 프로세스를 내가 직접 timeout에 맞춰 종료할 수 있고,
- stdout / stderr 로그를 안정적으로 받아올 수 있고,
- 람다든 EC2든, 환경과 무관하게 일관된 동작을 할 수 있는 장점이 있습니다.
5. 추가 팁
ffmpeg 로그가 너무 많으면 communicate()가 멈출 수 있어서, 그럴 땐 line by line으로 읽는 실시간 로그 처리도 고려해보셔요.
with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) as proc:
for line in proc.stdout:
print("ffmpeg >", line.strip())
이렇게 하면 ffmpeg가 출력하는 로그를 한 줄씩 바로바로 확인할 수 있어요.
디버깅할 때 정말 유용합니다.
파이썬에서 ffmpeg을 돌리다가 멈출 때 진짜...후 ............
저도 삽질 한참 하다가 이 방식으로 해결했습니다.
이 글은 저처럼 ffmpeg 작업 중 timeout 에러가 생겼을 때, 해결하시는데 도움 되었으면 좋겠어서 정리해 봤어요 ㅎㅎ
오늘도 씩씩한! 개발자였습니다!~
'Python' 카테고리의 다른 글
| Python 버전 업그레이드 & 인터프리터 설정하는 방법 (Mac + Windows) (0) | 2025.06.03 |
|---|---|
| MoviePy 2.x 버전 업그레이드 내용 | 영상 생성 프로젝트 적용 사례 (3) | 2025.06.02 |
| FFmpeg python사용 예제 모음집 (subprocess) (1) | 2025.05.31 |
| FFmpeg, FFprobe 설치하기 (0) | 2025.04.27 |
| Pycharm 파이참 콘솔 실행 단축키 설정하기 (0) | 2025.04.04 |