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

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 | Sume 오디오 분리 |
|---|---|---|
| 화면 빼기 | -vn | 현재 코드에서는 항상 적용 |
| 첫 번째 오디오 스트림 선택 | -map 0:a:0 | 현재 코드에서는 항상 적용 |
| 16비트 WAV 쓰기 | -c:a pcm_s16le | format: "wav"(기본값) |
| MP3 쓰기 | -c:a libmp3lame -b:a 128k | format: "mp3", 128 kbps |
| 모노로 믹스 | -ac 1 | channels: "mono" |
| 샘플레이트 설정 | -ar 16000 | sample_rate: 16000, 44100, 48000 중 하나 |
| 구간만 남기기 | -ss 30 -t 10 | start: 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에서 확인하라고 안내합니다. 호출의 나머지 내용은 영상 트림, 필터, 오디오 분리에서 다룹니다.
출처
관련 글
개발자 카테고리의 다른 글
- FFmpeg로 영상에서 프레임 추출하기: 한 장, 매초, 전체
FFmpeg로 프레임을 추출할 때 -frames:v 1은 이미지 한 장을, -r 1은 초당 한 장을 저장하고, 번호를 붙인 파일 패턴은 모든 프레임을 씁니다.
- FFmpeg height not divisible by 2 오류 원인과 해결
yuv420p 인코딩에 홀수 높이(또는 너비)가 들어갔다는 오류입니다. -2로 스케일하거나 trunc(ih/2)*2로 내림해 두 변을 짝수로 만드세요. Sume가 크기를 맞추는 방식도 다룹니다.
- FFmpeg 영상 자르기: 시간 지정과 재인코딩 여부
FFmpeg에서 영상을 자르려면 -i 앞의 -ss로 탐색하고 -t로 길이를 정하세요. -c copy를 쓰면 재인코딩을 건너뛰지만, 컷이 시작 지점 앞의 키프레임에서 시작합니다.
- HMAC과 디지털 서명의 차이: 웹훅에서 각각 무엇을 증명하나요?
HMAC은 송신자가 공유 시크릿을 가졌음을 증명합니다. 디지털 서명은 개인 키로 만들고 공개 키로 확인하며, 부인 방지까지 더합니다.
작성자 Sume