씩씩한 개발자

FFmpeg python사용 예제 모음집 (subprocess) 본문

Python

FFmpeg python사용 예제 모음집 (subprocess)

씩씩한 개발자 2025. 5. 31. 10:12

 

안녕하세요. 씩씩한 개발자입니다🔥


최근 python에서 ffmpeg 을 사용하는 일이 많아졌어요 ㅎㅎ


특히 Lambda 에서 GUI 없이 영상이나 오디오를 처리할 때 ffmpeg는 사실상 거의 유일한 방법이더라구요.

 

이 글에서는 제가 실제로 사용 중인 방식인 subprocess + ffmpeg 직접 호출 방식을 설명하고,

그 외에도 다양한 멀티미디어 처리 실전 예제를 Python 코드로 공유하고자 해요.


1. 기본 구조: ffmpeg subprocess 직접 호출

아래는 제가 실제로 python 에서 사용하고 있는 오디오 속도 조절 함수입니다.

AWS Lambda 환경에서 /mnt/efs/lambda/ffmpeg 경로에 ffmpeg 바이너리를 두고 subprocess 로 직접 호출하는 구조입니다.

 

제가 ffmpeg를 사용하는 방식은 subprocess를 이용한 직접 호출입니다.

def speed_up_audio(input_path, output_path, speed=1.4):
    ffmpeg_path = "/mnt/efs/lambda/ffmpeg"

    command = [
        ffmpeg_path,
        "-i", input_path,
        "-filter:a", f"atempo={speed}",
        "-vn",
        output_path
    ]

    subprocess.run(
        command,
        check=True,
        executable=ffmpeg_path,
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL
    )
  • -filter:a atempo=1.4 : 오디오 속도를 1.4배로 조절
  • -vn : 비디오 트랙은 제거. (오디오만 남김)
  • stdout/stderr : 콘솔 출력 없이 조용히 실행되도록 DEVNULL 처리
  • executable=ffmpeg_path : 명시적으로 실행파일 경로 지정 (권한 필요)

 

* subprocess 방식을 쓰는 이유

Python용 래퍼 라이브러리인 ffmpeg-python도 있지만, 실제 서버나 Lambda 환경에서는 직접 명령어를 구성해서 실행하는 방식이 훨씬 간단하고 안정적입니다. 그래서 subprocess 라이브러리를 사용하는거죠!

 

  • 직접 명령어를 쓸 수 있음: 공식 문서나 Stack Overflow 예제를 그대로 가져와 사용할 수 있음.
  • 복잡한 필터도 자유롭게 조합: drawtext, crop, scale, atempo 같은 필터도 그대로 조립 가능.
  • 오류 추적이 쉬움: stderr를 바로 확인해서 어떤 문제가 발생했는지 로그를 통해 알 수 있음.
  • 배포가 쉬움: ffmpeg 실행파일 하나만 있으면 되니 pip 설치 없이 Lambda에서도 사용 가능.

subprocess를 쓰면 특히 AWS Lambda 또는 권한 제한이 있는 서버 환경에서 효과적으로 사용할 수 있고, ffmpeg를 패키지화하지 않고 바이너리 파일을 업로드한 상태에서도 처리 가능합니다.


 

2. ffmpeg + Python 실전 예제 모음

 

2.1 오디오 자르기

def cut_audio(input_path, output_path, start="00:00:10", duration="00:00:05"):
    command = [
        "ffmpeg", "-ss", start, "-t", duration,
        "-i", input_path, output_path
    ]
    subprocess.run(command, check=True)

 

2.2 영상에서 오디오 제거

def remove_audio(input_path, output_path):
    command = [
        "ffmpeg", "-i", input_path,
        "-c", "copy", "-an", output_path
    ]
    subprocess.run(command, check=True)

 

2.3 영상 배속 조절

def speed_up_video(input_path, output_path, speed=2.0):
    pts_factor = 1 / speed
    command = [
        "ffmpeg", "-i", input_path,
        "-filter:v", f"setpts={pts_factor}*PTS",
        output_path
    ]
    subprocess.run(command, check=True)

 

2.4 텍스트 오버레이

def overlay_text(input_path, output_path, text):
    command = [
        "ffmpeg", "-i", input_path,
        "-vf", f"drawtext=text='{text}':x=10:y=10:fontsize=24:fontcolor=white",
        output_path
    ]
    subprocess.run(command, check=True)

 

2.5 자막 삽입 (SRT)

def burn_subtitles(input_path, subtitle_path, output_path):
    command = [
        "ffmpeg", "-i", input_path,
        "-vf", f"subtitles={subtitle_path}",
        output_path
    ]
    subprocess.run(command, check=True)

 

3. 마무리

 

2년 전 쯤... 처음 ffmpeg을 접했을 땐 진짜 무슨 말인지 하나도 모르겠었어요....

다 영상, 음성 등 멀티미디어 관련 전문적인 용어인 것 같고..

 

사실 지금도 모르는 게 많지만, 쓰다 보니 조금은 감이 오더라고요..(?아마도)

 

처음엔 다른 더 쉬운 방법 없나.. 했지만 

영상, 오디오, 자막 같은 미디어 파일을 자동으로 처리해야 할 때는 ffmpeg이 거의 유일한..  툴이에요...ㅎㅎㅎ


ffmpeg으로 mp3 음성 속도 조절, 자막 Burn-in, 해상도 조절, mp4 인코딩 등 다양한 곳에 아주 유용하게 사용하고 있습니다.

 

거의 AWS Lambda에서 쓰는데요,

/mnt/efs에 ffmpeg 바이너리 실행파일만 올려두고 subprocess로 실행하면 별도 설치 없이도 잘동작합니다.

이 바이너리 파일 올리는 방법 찾는데도 꽤나 애를 먹었어요. 자세한 방법은 아래 포스팅 참고해 주세요~

 

https://strongdev.tistory.com/8

 

Lambda에서 대용량 실행파일 사용하는 방법: FFmpeg 예제 (EFS,EC2)

안녕하세요. 씩씩한 개발자입니다🔥 오늘은 AWS Lambda에서 ffmpeg을 사용하려고 하다가 Layer로 올리는데 실패한 후..EFS를 이용해서 ffmpeg을 사용한 방법에 대해서 공유해 드리려고 해요! Lambda 용량

strongdev.tistory.com

 

반응형