FFmpeg로 영상에서 오디오 추출하기: 복사, MP3, WAV

FFmpeg로 영상에서 오디오를 추출하려면 -vn으로 화면을 빼고, -c:a copy로 오디오를 그대로 두거나 인코더로 WAV나 MP3를 쓰세요.

읽는 시간 5분Sume
전체 글

FFmpeg로 영상에서 오디오를 추출하려면 -vn으로 화면을 빼고 소리를 어떻게 할지 고르세요. -c:a copy로 오디오 스트림을 그대로 복사하면 코덱이 유지되어 재인코딩도 품질 손실도 없고, WAV(-c:a pcm_s16le)나 MP3(-c:a libmp3lame) 같은 새 포맷으로 인코딩할 수도 있습니다.

FFmpeg 관련 내용은 ffmpeg, 코덱, 포맷, 유틸리티 문서에서, Sume 관련 내용은 오디오 분리와 영상 검사 문서에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.

재인코딩 없이 오디오를 추출하려면 어떻게 하나요?

오디오 스트림을 오디오 전용 파일로 복사하세요. FFmpeg는 MP4 계열의 파일 확장자로 m4a를 꼽으므로, MP4에 든 AAC 오디오는 .m4a 파일에 넣을 수 있습니다.

  • -vn을 출력 옵션으로 쓰면 영상 기록이 꺼집니다. 출력에 어떤 영상 스트림도 선택되거나 매핑되지 않습니다.
  • copy는 스트림을 재인코딩하지 말라고 FFmpeg에 알립니다. FFmpeg 문서에 따르면 디코딩도 인코딩도 하지 않으므로 품질 손실이 없습니다.
  • 복사는 실패할 수도 있습니다. FFmpeg 문서에 따르면 스트림 카피는 경우에 따라 동작하지 않을 수 있습니다. 예를 들어 대상 컨테이너에 필요한 정보가 소스에 없을 때입니다. 그러니 출력 확장자는 복사하는 코덱을 담을 수 있는 컨테이너여야 합니다.
  • 복사하면서 자르면 컷이 정확하지 않습니다. FFmpeg 문서에 따르면 대부분의 포맷은 정확히 탐색할 수 없어서, -i 앞에 -ss를 두면 지정 위치 앞의 가장 가까운 탐색 지점으로 이동하고, 스트림 카피는 그 여분 구간을 버리지 않고 그대로 남깁니다.
ffmpeg -i input.mp4 -vn -c:a copy output.m4a

오디오를 WAV나 MP3로 추출하려면 어떻게 하나요?

copy 대신 오디오 인코더를 지정하세요. 인코딩은 오디오를 디코딩한 뒤 다시 인코딩하는데, FFmpeg 문서에 따르면 이 과정은 대부분의 경우 품질을 떨어뜨립니다. 그러니 원래 코덱으로 충분하다면 복사하세요.

  • libmp3lame은 LAME MP3 인코더를 감싼 래퍼이며, FFmpeg를 --enable-libmp3lame으로 빌드했을 때만 들어 있습니다. -b:a 128k는 FFmpeg 문서의 MP3 예시가 쓰는 비트레이트입니다.
  • -ac 1은 채널을 하나(모노)로 정하고, -ar 16000은 샘플레이트를 정합니다. 이 옵션이 없으면 FFmpeg는 입력의 채널 수와 샘플레이트를 그대로 유지합니다.
  • AAC를 유지하려면 FFmpeg의 네이티브 AAC 인코더인 -c:a aac를 쓰면 됩니다. 비트레이트를 지정하지 않으면 128 kbps를 씁니다.
# WAV: uncompressed PCM, signed 16-bit little-endian
ffmpeg -i input.mp4 -vn -c:a pcm_s16le output.wav

# MP3 at 128 kbps
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 128k output.mp3

오디오 트랙 하나나 특정 구간만 고르려면 어떻게 하나요?

  • -map 0:a:1은 첫 번째 입력의 두 번째 오디오 스트림을 가져옵니다. 번호는 0부터 세므로, FFmpeg 문서는 세 번째 오디오 스트림을 0:a:2로 선택합니다.
  • -i 앞의 -ss 30은 30초 지점에서 시작하고, -t 10은 10초를 남깁니다. 시간은 55나 0.2 같은 초 단위 숫자로 쓰거나 HH:MM:SS 형식으로 쓸 수 있습니다.
  • 인코딩할 때는 시작 지점이 정확합니다. 기본값인 -accurate_seek 옵션이 켜져 있으면 FFmpeg가 탐색 지점과 지정 위치 사이 구간을 디코딩한 뒤 버리기 때문입니다.

대신 Sume API로 오디오를 추출할 수 있나요?

네, 이미 워크스페이스에 있는 영상이라면 가능합니다. POST /v1/audio-detach는 위 명령 중 인코딩 방식을 서버에서 실행합니다. 소스 스트림을 복사하는 일은 없고, 항상 새 WAV나 MP3 파일을 씁니다. 현재 코드에서 각 옵션은 FFmpeg에 다음과 같이 대응합니다.

FFmpeg 옵션은 ffmpeg 문서, Sume 필드는 오디오 분리 문서와 현재 실행되는 컴파일러 기준, 2026-09-28 확인.
목적FFmpegSume 오디오 분리
화면 빼기-vn현재 코드에서는 항상 적용
첫 번째 오디오 스트림 선택-map 0:a:0현재 코드에서는 항상 적용
16비트 WAV 쓰기-c:a pcm_s16leformat: "wav"(기본값)
MP3 쓰기-c:a libmp3lame -b:a 128kformat: "mp3", 128 kbps
모노로 믹스-ac 1channels: "mono"
샘플레이트 설정-ar 16000sample_rate: 16000, 44100, 48000 중 하나
구간만 남기기-ss 30 -t 10start: 30, end: 40인 range
재인코딩 없이 복사-c:a copy제공하지 않음
curl -X POST https://api.sume.com/v1/audio-detach \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: audio-detach-mp3-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4",
    "format": "mp3",
    "range": { "start": 30, "end": 40 }
  }'

오디오 분리에는 어떤 한도가 있나요?

  • video_url은 이전 Sume Job의 출력처럼 워크스페이스에 있는 media.sume.com 아티팩트나 에셋이어야 합니다. 이 규칙은 엔드포인트별로 받는 URL에서 설명합니다.
  • 소스는 최대 1,800초, 출력은 하나당 최대 900초이므로, 900초를 넘는 트랙 전체를 뽑으려면 range가 필요합니다. 현재 코드에서는 300 MiB가 넘는 소스 파일이 source_too_large로 거부됩니다.
  • 오디오 트랙이 없는 영상은 detach_source_has_no_audio로 실패합니다. 먼저 frames: false로 영상 검사를 실행해 probe.has_audio를 확인하세요.
  • 오디오 분리는 Job당 과금되며 기본적으로 5.5% 에이전트 수수료가 더해집니다. 문서는 요율을 GET /v1/catalog에서 확인하라고 안내합니다. 호출의 나머지 내용은 영상 트림, 필터, 오디오 분리에서 다룹니다.

출처

관련 글

개발자 카테고리의 다른 글

개발자 글 전체 보기

작성자 Sume