FFmpeg로 오디오와 영상 합치기: -map, copy, -shortest
FFmpeg로 오디오와 영상을 합치려면 한 파일에서는 영상을, 다른 파일에서는 오디오를 매핑하고, 영상은 복사하고, -shortest로 길이를 맞추세요.

FFmpeg로 오디오와 영상을 합치려면 두 파일을 모두 입력으로 주고, 첫 번째 파일에서는 영상 스트림을, 두 번째 파일에서는 오디오 스트림을 매핑하세요. 명령은 ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -c:a aac -shortest output.mp4입니다. 영상은 그대로 복사되고, 오디오는 AAC로 인코딩되며, -shortest는 둘 중 짧은 쪽이 끝날 때 파일을 끝냅니다.
FFmpeg 관련 내용은 ffmpeg, 코덱, 필터 문서에서, Sume 관련 내용은 Timeline 1.0 문서와 Sume API 레퍼런스에서 가져왔으며, 모두 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다.
명령의 각 부분은 무엇을 하나요?
핵심은 -map 옵션 두 개입니다. FFmpeg 문서도 ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4처럼 같은 방식으로 두 파일의 스트림을 합칩니다. 그러니 오디오가 이미 AAC라면 -c copy로 두 스트림을 모두 복사하고, 아무것도 재인코딩하지 않습니다.
| 옵션 | 하는 일 |
|---|---|
-i video.mp4 -i audio.wav | 입력 두 개. 지정한 순서대로 0번, 1번 |
-map 0:v | 입력 0에서 영상을 가져옴. -map을 하나라도 쓰면 그 출력에 대한 FFmpeg의 기본 스트림 선택이 꺼짐 |
-map 1:a | 입력 1에서 오디오를 가져오므로 영상 파일 자체의 소리는 빠짐 |
-c:v copy | 영상 스트림을 재인코딩 없이 복사. 화질 손실 없음 |
-c:a aac | FFmpeg의 네이티브 AAC 인코더로 오디오를 인코딩. -b:a를 지정하지 않으면 128 kbps |
-shortest | 가장 짧은 출력 스트림이 끝나면 인코딩을 마침 |
오디오와 영상의 길이가 다르면 어떻게 되나요?
경우마다 옵션 하나로 원하는 동작을 고를 수 있습니다.
-shortest는 더 짧은 스트림에 맞춰 파일을 끝냅니다. 긴 노래는 영상이 끝나는 지점에서 잘리고, 짧은 보이스오버는 자신이 끝나는 지점에서 영상을 자릅니다.- 영상 전체를 남기고 더 짧은 트랙을 무음으로 채우려면
-shortest와 함께 FFmpeg의apad필터를 더하세요. 이 필터의 문서가 바로 이 조합을 설명하며, 오디오가 영상 길이만큼 늘어납니다. 명령은ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -c:a aac -af apad -shortest output.mp4입니다. - 대신 정확한 길이에서 끝내려면
-t를 지정하세요. 그 길이만큼 쓴 뒤 출력 쓰기를 멈춥니다.
영상 원래의 소리를 살리면서 새 오디오를 더하려면 어떻게 하나요?
한 트랙을 다른 트랙으로 바꾸는 대신 amix 필터로 두 트랙을 믹스하세요. duration=first는 첫 번째 입력, 여기서는 영상 자체의 소리가 끝날 때 믹스를 끝냅니다.
weights는 입력마다 비중을 정합니다. FFmpeg 문서의 예시는 음악에 보컬의 사분의 일 가중치를 줍니다. 이 예시는normalize=0도 지정하는데, 기본적으로 amix는 입력을 단순히 더하지 않고 크기를 조정하기 때문입니다.[0:a]가 존재하려면 영상 파일에 오디오 스트림이 있어야 합니다. 클립의 소리 위에 보이스오버를 얹는 Sume 방식은 영상에 보이스오버를 넣는 방법을 참고하세요.
ffmpeg -i video.mp4 -i voice.wav -filter_complex \
'[0:a][1:a]amix=inputs=2:duration=first[a]' \
-map 0:v -map '[a]' -c:v copy -c:a aac output.mp4Sume API로 오디오와 영상을 합치려면 어떻게 하나요?
Timeline 1.0으로 새 트랙 위에 클립을 렌더링하세요. 오디오 파일이 렌더의 스파인(audio.url)이 되고, audio.duration_seconds가 출력 길이를 정합니다. 현재 코드에서 렌더는 -c:v copy와 달리 영상을 재인코딩하고, 클립 자체의 소리는 넣지 않습니다. 기본 프레임이 1080×1920이므로 output을 클립 크기로 설정하세요. 요청은 영상의 오디오를 교체하거나 제거하기에서 볼 수 있습니다.
-shortest가 더 짧은 스트림에서 멈추는 것과 달리, 렌더는 항상 오디오를 따릅니다. API 레퍼런스에 따르면 출력 길이는 정확히 audio.duration_seconds입니다.
- 영상이 오디오보다 짧을 때: 현재 코드에서는 일찍 끝나는 슬롯이 끝까지 마지막 프레임을 유지하고
video_coverage_shorter_than_audio경고를 내며, 소스 파일보다 긴 슬롯은render.pad_mode가 채우는데 기본적으로 짧은 소스를 루프합니다. 두 경우 모두 영상은 멈추고 소리만 나올 때에서 다룹니다. - 영상이 오디오보다 길 때: 마지막 슬롯을 스파인 끝에서 끝내세요. 현재 코드에서는 스파인 끝을 0.5초 넘게 지나서 끝나는 슬롯이
invalid_segment_timing으로 거부됩니다. - 두 파일 모두 이미 워크스페이스에 있는
media.sume.com파일이어야 합니다. 예를 들어 스파인에는 오디오 분리로 만든 WAV나 TTS 마스터를 쓸 수 있습니다. 이 규칙은 엔드포인트별로 받는 URL에서 설명합니다. 현재 코드에서는 300 MiB가 넘는 소스 파일이source_too_large로 거부됩니다. - API 요금에는 렌더가 출력 분당 $0.10로 나와 있으며, 렌더는
ceil(audio.duration_seconds / 60)분을 예약하고 기본적으로 5.5% 에이전트 수수료가 더해집니다.
출처
관련 글
개발자 카테고리의 다른 글
- FFmpeg 영상 자르기: 시간 지정과 재인코딩 여부
FFmpeg에서 영상을 자르려면 -i 앞의 -ss로 탐색하고 -t로 길이를 정하세요. -c copy를 쓰면 재인코딩을 건너뛰지만, 컷이 시작 지점 앞의 키프레임에서 시작합니다.
- HMAC과 디지털 서명의 차이: 웹훅에서 각각 무엇을 증명하나요?
HMAC은 송신자가 공유 시크릿을 가졌음을 증명합니다. 디지털 서명은 개인 키로 만들고 공개 키로 확인하며, 부인 방지까지 더합니다.
- AI 이미지 생성은 얼마나 걸리나요?
Sume에서는 대부분의 AI 이미지가 API가 요청을 열어 두는 30초 안에 완성됩니다. 무엇이 시간을 늘리는지, 느린 이미지와 멈춘 이미지를 어떻게 구분하는지 알아보세요.
- MCP 서버 테스트 방법: Inspector, Postman, curl
MCP 서버는 MCP Inspector로 테스트합니다. 연결하고, 로그인하거나 인증 헤더를 넣고, 도구 목록을 본 뒤 읽기 전용 도구를 호출하세요. Postman과 curl로도 됩니다.
작성자 Sume