AAC vs MP3 vs Opus 오디오 코덱 비교 | 음질·비트레이트·호환성 가이드
이 글의 핵심
AAC vs MP3 vs Opus — 음질·대역폭·지연·호환성을 비교하고 용도별로 고르는 법을 정리합니다.
들어가며
음성 통화·음악 스트리밍·게임·팟캐스트까지 오디오 코덱은 대역폭과 체감 품질을 동시에 결정합니다. MP3는 여전히 널리 쓰이고, AAC는 Apple·방송에서 표준처럼 자리했으며, Opus는 초저지연·음성 최적화로 강합니다.
비유로 말씀드리면, MP3는 오래된 압축 여행 가방, AAC는 같은 짐을 더 단정히 넣는 신형 캐리어, Opus는 짧은 대화를 위한 초경량 파우치에 가깝습니다. 음악 전체를 아끼는지, 음성만 실시간으로 실을지에 따라 선택이 갈립니다.
이 글을 읽으면
- AAC / MP3 / Opus의 설계 목적과 대표 비트레이트 대역을 이해합니다
- 음악 vs 음성 vs 라이브에 맞는 코덱 선택 기준을 잡습니다
- FFmpeg로 인코딩하는 기본 명령을 익힙니다
- 컨테이너(MP4, Ogg, WebM)와의 조합 감각을 갖춥니다
목차
1. 빠른 비교표
| 특성 | MP3 | AAC (LC) | Opus |
|---|---|---|---|
| 출시 | 1993 | 1997 | 2012 |
| 압축 효율 | 기준 | MP3보다 30% 향상 | MP3보다 50% 향상 |
| 비트레이트 범위 | 32-320 kbps | 8-529 kbps | 6-510 kbps |
| 지연 (latency) | 높음 (~100ms) | 중간 (~50ms) | 낮음 (5-66ms) |
| 호환성 | 최고 | 높음 | 중간 |
| 라이선스 | 특허 만료 | 특허 존재 | 로열티 프리 |
| 대표 용도 | 범용, 레거시 | 스트리밍, 모바일 | VoIP, WebRTC |
2. 각 코덱 상세
MP3 (MPEG-1 Audio Layer III)
역사: 1993년 Fraunhofer IIS에서 개발, Napster를 통해 대중화
기술적 특징:
- 심리음향 모델 + MDCT
- 프레임 크기: 1152 샘플
- Joint Stereo 지원
장점:
- 거의 모든 기기에서 재생 가능
- 사용자 인지도 최고
- 편집 툴 지원 광범위
단점:
- 동일 비트레이트에서 AAC/Opus 대비 효율 낮음
- 5.1 서라운드 미지원
- 고주파 손실 큼
FFmpeg 예제:
# VBR 고품질
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
# CBR 192 kbps
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3
# 모노 (음성)
ffmpeg -i input.wav -ac 1 -c:a libmp3lame -b:a 64k output.mp3
AAC (Advanced Audio Coding)
역사: 1997년 MPEG-2 Part 7, 후에 MPEG-4 Part 3로 확장
프로파일:
- AAC-LC: 가장 흔함, 범용
- HE-AAC: 저비트레이트 최적화 (32-64 kbps)
- HE-AACv2: 스테레오 효율 향상
장점:
- MP3보다 30% 효율 향상
- 5.1 서라운드 지원
- Apple 생태계 표준
단점:
- 구형 기기 일부 미지원
- 특허 라이선스 필요 (상용)
FFmpeg 예제:
# AAC-LC 128 kbps
ffmpeg -i input.wav -c:a aac -b:a 128k output.m4a
# HE-AAC 64 kbps (저비트레이트)
ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 64k output.m4a
# VBR 모드
ffmpeg -i input.wav -c:a aac -q:a 2 output.m4a
Opus
역사: 2012년 IETF RFC 6716, SILK + CELT 결합
기술적 특징:
- SILK: 음성 최적화 (6-40 kbps)
- CELT: 음악 최적화 (48-510 kbps)
- 자동 모드 전환
장점:
- 음성에서 최고 효율
- 초저지연 (5ms 가능)
- 로열티 프리
- 6-510 kbps 광범위 지원
단점:
- 레거시 하드웨어 미지원
- 일부 DAW 미지원
FFmpeg 예제:
# 음성 (32 kbps)
ffmpeg -i input.wav -c:a libopus -b:a 32k -application voip output.opus
# 음악 (128 kbps)
ffmpeg -i input.wav -c:a libopus -b:a 128k -application audio output.opus
# VBR 모드
ffmpeg -i input.wav -c:a libopus -b:a 96k -vbr on output.opus
# WebM 컨테이너
ffmpeg -i input.wav -c:a libopus -b:a 128k output.webm
3. 성능 비교
비트레이트별 음질 비교
테스트 조건: 44.1kHz 스테레오, 팝 음악
| 비트레이트 | MP3 | AAC-LC | Opus | 평가 |
|---|---|---|---|---|
| 64 kbps | 나쁨 | 보통 | 좋음 | Opus 압도적 |
| 96 kbps | 보통 | 좋음 | 매우 좋음 | AAC/Opus 유리 |
| 128 kbps | 좋음 | 매우 좋음 | 매우 좋음 | 일반 청취 충분 |
| 192 kbps | 매우 좋음 | 우수 | 우수 | 구분 어려움 |
| 256 kbps | 우수 | 우수 | 우수 | 원본과 거의 동일 |
음성 (Speech) 비교
테스트 조건: 16kHz 모노, 음성 전용
| 비트레이트 | MP3 | AAC-HE | Opus | 평가 |
|---|---|---|---|---|
| 16 kbps | 사용 불가 | 나쁨 | 좋음 | Opus만 실용 |
| 24 kbps | 나쁨 | 보통 | 매우 좋음 | Opus 최적 |
| 32 kbps | 보통 | 좋음 | 우수 | Opus 압도적 |
| 64 kbps | 좋음 | 매우 좋음 | 우수 | 모두 충분 |
결론: 음성은 Opus가 압도적
지연 시간 (Latency) 비교
| 코덱 | 알고리즘 지연 | 프레임 크기 | 총 지연 | 용도 |
|---|---|---|---|---|
| MP3 | ~100ms | 1152 샘플 | 높음 | 파일 재생 |
| AAC-LC | ~50ms | 1024 샘플 | 중간 | 스트리밍 |
| Opus | 5-66ms | 설정 가능 | 낮음 | 실시간 통화 |
결론: 실시간은 Opus 필수
인코딩 속도 비교
테스트: 5분 WAV 파일 (44.1kHz 스테레오)
| 인코더 | 설정 | 인코딩 시간 | 파일 크기 |
|---|---|---|---|
| LAME | VBR -V 2 | 8s | 8.5MB |
| LAME | CBR 192k | 7s | 7.2MB |
| FFmpeg AAC | VBR -q:a 2 | 12s | 6.8MB |
| libopus | 128k | 6s | 6.0MB |
결론: Opus가 가장 빠르고 작음
4. 사용 시나리오별 추천
시나리오 비교표
| 시나리오 | 추천 코덱 | 비트레이트 | 이유 |
|---|---|---|---|
| 음악 스트리밍 | AAC-LC | 128-256 kbps | 효율·품질 균형 |
| 팟캐스트 | MP3 | 64-96 kbps (모노) | 최대 호환 |
| VoIP/화상회의 | Opus | 16-32 kbps | 저지연·음성 최적 |
| 게임 보이스챗 | Opus | 24-48 kbps | 저지연·대역폭 절약 |
| 라디오 방송 | AAC-LC | 128-192 kbps | 방송 표준 |
| USB/차량 오디오 | MP3 | 192-320 kbps | 하드웨어 호환 |
| 웹 오디오 | Opus/AAC | 96-128 kbps | 브라우저 지원 |
5. 실무 사례
사례 1: 음악 스트리밍 플랫폼
요구사항:
- 다양한 품질 제공
- 적응형 스트리밍
- 대역폭 최적화
구현 전략
# 마스터 파일에서 다중 품질 생성
# 저품질 (모바일 데이터)
ffmpeg -i master.wav -c:a aac -b:a 96k low.m4a
# 중품질 (Wi-Fi)
ffmpeg -i master.wav -c:a aac -b:a 192k medium.m4a
# 고품질 (프리미엄)
ffmpeg -i master.wav -c:a aac -b:a 256k high.m4a
# 호환용 (레거시)
ffmpeg -i master.wav -c:a libmp3lame -b:a 192k compat.mp3
HLS 매니페스트
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=96000,CODECS="mp4a.40.2"
low.m4a
#EXT-X-STREAM-INF:BANDWIDTH=192000,CODECS="mp4a.40.2"
medium.m4a
#EXT-X-STREAM-INF:BANDWIDTH=256000,CODECS="mp4a.40.2"
high.m4a
사례 2: WebRTC 화상회의
요구사항:
- 초저지연 (<50ms)
- 음성 명료도
- 대역폭 적응
Opus 설정
// WebRTC Opus 설정
const audioConfig = {
codec: 'opus',
bitrate: 32000, // 32 kbps
sampleRate: 48000,
channels: 1, // 모노
fec: true, // Forward Error Correction
dtx: true // Discontinuous Transmission
};
// SDP 예시
const sdp = `
m=audio 9 UDP/TLS/RTP/SAVPF 111
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10;useinbandfec=1;usedtx=1
a=maxptime:60
`;
FFmpeg 테스트 인코딩
# 음성 최적화 (16 kbps)
ffmpeg -i voice.wav -c:a libopus -b:a 16k -application voip output.opus
# 음악 최적화 (128 kbps)
ffmpeg -i music.wav -c:a libopus -b:a 128k -application audio output.opus
사례 3: 팟캐스트 배포
요구사항:
- 최대 호환성
- 파일 크기 최소화
- RSS 피드 지원
MP3 설정 (최대 호환)
# 모노, 64 kbps CBR
ffmpeg -i podcast.wav \
-ac 1 \
-c:a libmp3lame \
-b:a 64k \
-ar 44100 \
-metadata title="에피소드 제목" \
-metadata artist="팟캐스트 이름" \
-metadata album="시즌 1" \
-metadata date="2026" \
output.mp3
Python 자동화
import subprocess
from pathlib import Path
def create_podcast_episode(input_file, metadata):
"""
팟캐스트 에피소드 생성
"""
output_file = Path(metadata['filename'])
cmd = [
'ffmpeg', '-y',
'-i', input_file,
'-ac', '1',
'-c:a', 'libmp3lame',
'-b:a', '64k',
'-ar', '44100',
'-metadata', f"title={metadata['title']}",
'-metadata', f"artist={metadata['artist']}",
'-metadata', f"album={metadata['album']}",
'-metadata', f"date={metadata['date']}",
str(output_file)
]
subprocess.run(cmd, check=True)
return output_file
# 사용
metadata = {
'filename': 'episode_01.mp3',
'title': '첫 번째 에피소드',
'artist': '내 팟캐스트',
'album': '시즌 1',
'date': '2026'
}
create_podcast_episode('recording.wav', metadata)
사례 4: 게임 오디오 - 다중 코덱 지원
요구사항:
- PC: Opus (효율)
- 모바일: AAC (호환)
- 레거시: MP3 (폴백)
빌드 스크립트
import subprocess
from pathlib import Path
def build_game_audio(input_dir, output_dir):
"""
게임 오디오 다중 포맷 생성
"""
formats = [
('opus', 'libopus', '96k', '.opus'),
('aac', 'aac', '128k', '.m4a'),
('mp3', 'libmp3lame', '128k', '.mp3')
]
for wav_file in Path(input_dir).glob('*.wav'):
stem = wav_file.stem
for name, codec, bitrate, ext in formats:
output_file = Path(output_dir) / name / f"{stem}{ext}"
output_file.parent.mkdir(parents=True, exist_ok=True)
cmd = [
'ffmpeg', '-y',
'-i', str(wav_file),
'-c:a', codec,
'-b:a', bitrate,
str(output_file)
]
print(f"Creating {name}: {stem}{ext}")
subprocess.run(cmd, check=True)
# 사용
build_game_audio('assets/audio', 'build/audio')
6. 마이그레이션 가이드
MP3 → AAC
1단계: 호환성 확인
import subprocess
def check_aac_support():
"""
FFmpeg AAC 인코더 확인
"""
result = subprocess.run(
['ffmpeg', '-encoders'],
capture_output=True,
text=True
)
if 'aac' in result.stdout:
print("AAC 인코더 사용 가능")
return True
return False
2단계: 비트레이트 조정
# MP3 192 kbps → AAC 128 kbps (비슷한 품질)
ffmpeg -i input.mp3 -c:a aac -b:a 128k output.m4a
3단계: 메타데이터 이전
import subprocess
import json
def migrate_metadata(mp3_file, m4a_file):
"""
MP3 ID3 → M4A 메타데이터
"""
result = subprocess.run(
['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', mp3_file],
capture_output=True,
text=True
)
metadata = json.loads(result.stdout)['format']['tags']
cmd = ['ffmpeg', '-y', '-i', mp3_file, '-c:a', 'aac', '-b:a', '128k']
for key, value in metadata.items():
cmd.extend(['-metadata', f'{key}={value}'])
cmd.append(m4a_file)
subprocess.run(cmd, check=True)
# 사용
migrate_metadata('song.mp3', 'song.m4a')
AAC/MP3 → Opus
1단계: 용도 확인
def select_opus_application(use_case):
"""
Opus 애플리케이션 모드 선택
"""
modes = {
'voip': 'voip', # 음성 통화
'audio': 'audio', # 음악
'lowdelay': 'lowdelay' # 저지연
}
return modes.get(use_case, 'audio')
2단계: 변환
# 음성 (32 kbps)
ffmpeg -i voice.mp3 -c:a libopus -b:a 32k -application voip output.opus
# 음악 (96 kbps)
ffmpeg -i music.aac -c:a libopus -b:a 96k -application audio output.opus
7. 트러블슈팅
문제 1: 브라우저 재생 안 됨
증상: Chrome에서 Opus 재생 안 됨
<audio src="audio.opus" controls></audio>
<!-- 재생 불가 -->
원인: 컨테이너 문제
해결: Ogg 또는 WebM 컨테이너 사용
# Ogg 컨테이너
ffmpeg -i input.wav -c:a libopus -b:a 128k output.ogg
# WebM 컨테이너
ffmpeg -i input.wav -c:a libopus -b:a 128k output.webm
<audio controls>
<source src="audio.ogg" type="audio/ogg; codecs=opus">
<source src="audio.m4a" type="audio/mp4">
</audio>
문제 2: 음질 저하 (재압축)
증상: MP3 → AAC 변환 시 음질 저하
# 잘못된 예
ffmpeg -i input.mp3 -c:a aac -b:a 128k output.m4a
# 손실 → 손실 (품질 저하)
해결: 무손실 원본 유지
# 올바른 워크플로우
# 1. 원본 WAV/FLAC 보관
# 2. 필요한 포맷으로 한 번만 인코딩
ffmpeg -i master.wav -c:a aac -b:a 128k aac_version.m4a
ffmpeg -i master.wav -c:a libmp3lame -b:a 192k mp3_version.mp3
문제 3: 호환성 문제
증상: 구형 기기에서 AAC/Opus 재생 안 됨
해결: 다중 포맷 제공
<audio controls>
<source src="audio.opus" type="audio/ogg; codecs=opus">
<source src="audio.m4a" type="audio/mp4">
<source src="audio.mp3" type="audio/mpeg">
브라우저가 audio 태그를 지원하지 않습니다.
</audio>
문제 4: 파일 크기 예측 불가
증상: VBR 모드에서 파일 크기를 미리 알 수 없음
해결: ABR 또는 CBR 사용
# CBR (크기 예측 가능)
ffmpeg -i input.wav -c:a aac -b:a 128k output.m4a
# 파일 크기 계산
# 크기 = (비트레이트 * 시간) / 8
# 128 kbps * 300s / 8 = 4.8 MB
마무리
AAC vs MP3 vs Opus — 각 코덱은 설계 목적이 다릅니다.
핵심 요약
-
MP3
- 최고 호환성
- 레거시 시스템
- 범용 파일 포맷
-
AAC
- 음악 스트리밍 표준
- MP3보다 30% 효율 향상
- Apple 생태계
-
Opus
- 음성 최적화
- 초저지연 (<50ms)
- WebRTC 표준
선택 가이드
호환성 최우선? → MP3
↓ No
음성/실시간? → Opus
↓ No
음악 스트리밍? → AAC
실전 체크리스트
- ✅ 타깃 플랫폼 확인 (브라우저, 모바일, 하드웨어)
- ✅ 지연 요구사항 확인 (실시간 vs 파일 재생)
- ✅ 비트레이트 예산 확인 (대역폭 제약)
- ✅ 라이선스 확인 (상용 배포 시)
- ✅ 무손실 원본 유지 (재압축 방지)
추천 조합
| 플랫폼 | 비디오 | 오디오 | 컨테이너 |
|---|---|---|---|
| 웹 (최신) | VP9/AV1 | Opus | WebM |
| 웹 (호환) | H.264 | AAC | MP4 |
| iOS/Safari | H.264 | AAC | MP4 |
| WebRTC | VP8/VP9 | Opus | - |
| 레거시 | H.264 | MP3 | MP4 |
다음 단계
- AAC 상세: AAC 완벽 가이드
- MP3 상세: MP3 실전 가이드
- Opus 상세: Opus 차세대 오디오
참고 자료
- MPEG AAC: ISO/IEC 13818-7, 14496-3
- Opus: IETF RFC 6716
- FFmpeg 문서: https://ffmpeg.org/ffmpeg-codecs.html
한 줄 정리: 호환성이면 MP3/AAC, 음성·실시간이면 Opus를 기본에 두고 레거시만 MP3로 폴백한다.