FFmpeg로 오디오와 영상 합치기: -map, copy, -shortest

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

읽는 시간 5분Sume
전체 글

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로 두 스트림을 모두 복사하고, 아무것도 재인코딩하지 않습니다.

ffmpeg와 코덱 문서 기준, 2026-09-28 확인.
옵션하는 일
-i video.mp4 -i audio.wav입력 두 개. 지정한 순서대로 0번, 1번
-map 0:v입력 0에서 영상을 가져옴. -map을 하나라도 쓰면 그 출력에 대한 FFmpeg의 기본 스트림 선택이 꺼짐
-map 1:a입력 1에서 오디오를 가져오므로 영상 파일 자체의 소리는 빠짐
-c:v copy영상 스트림을 재인코딩 없이 복사. 화질 손실 없음
-c:a aacFFmpeg의 네이티브 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.mp4

Sume 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% 에이전트 수수료가 더해집니다.

출처

관련 글

개발자 카테고리의 다른 글

개발자 글 전체 보기

작성자 Sume