AAC vs MP3 vs Opus 오디오 코덱 비교 | 음질·비트레이트·호환성 가이드

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. 빠른 비교표
  2. 각 코덱 상세
  3. 성능 비교
  4. 사용 시나리오별 추천
  5. 실무 사례
  6. 마이그레이션 가이드
  7. 트러블슈팅
  8. 마무리

1. 빠른 비교표

특성MP3AAC (LC)Opus
출시199319972012
압축 효율기준MP3보다 30% 향상MP3보다 50% 향상
비트레이트 범위32-320 kbps8-529 kbps6-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 스테레오, 팝 음악

비트레이트MP3AAC-LCOpus평가
64 kbps나쁨보통좋음Opus 압도적
96 kbps보통좋음매우 좋음AAC/Opus 유리
128 kbps좋음매우 좋음매우 좋음일반 청취 충분
192 kbps매우 좋음우수우수구분 어려움
256 kbps우수우수우수원본과 거의 동일

음성 (Speech) 비교

테스트 조건: 16kHz 모노, 음성 전용

비트레이트MP3AAC-HEOpus평가
16 kbps사용 불가나쁨좋음Opus만 실용
24 kbps나쁨보통매우 좋음Opus 최적
32 kbps보통좋음우수Opus 압도적
64 kbps좋음매우 좋음우수모두 충분

결론: 음성은 Opus가 압도적

지연 시간 (Latency) 비교

코덱알고리즘 지연프레임 크기총 지연용도
MP3~100ms1152 샘플높음파일 재생
AAC-LC~50ms1024 샘플중간스트리밍
Opus5-66ms설정 가능낮음실시간 통화

결론: 실시간은 Opus 필수

인코딩 속도 비교

테스트: 5분 WAV 파일 (44.1kHz 스테레오)

인코더설정인코딩 시간파일 크기
LAMEVBR -V 28s8.5MB
LAMECBR 192k7s7.2MB
FFmpeg AACVBR -q:a 212s6.8MB
libopus128k6s6.0MB

결론: Opus가 가장 빠르고 작음


4. 사용 시나리오별 추천

시나리오 비교표

시나리오추천 코덱비트레이트이유
음악 스트리밍AAC-LC128-256 kbps효율·품질 균형
팟캐스트MP364-96 kbps (모노)최대 호환
VoIP/화상회의Opus16-32 kbps저지연·음성 최적
게임 보이스챗Opus24-48 kbps저지연·대역폭 절약
라디오 방송AAC-LC128-192 kbps방송 표준
USB/차량 오디오MP3192-320 kbps하드웨어 호환
웹 오디오Opus/AAC96-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 — 각 코덱은 설계 목적이 다릅니다.

핵심 요약

  1. MP3

    • 최고 호환성
    • 레거시 시스템
    • 범용 파일 포맷
  2. AAC

    • 음악 스트리밍 표준
    • MP3보다 30% 효율 향상
    • Apple 생태계
  3. Opus

    • 음성 최적화
    • 초저지연 (<50ms)
    • WebRTC 표준

선택 가이드

호환성 최우선? → MP3
  ↓ No
음성/실시간? → Opus
  ↓ No
음악 스트리밍? → AAC

실전 체크리스트

  • ✅ 타깃 플랫폼 확인 (브라우저, 모바일, 하드웨어)
  • ✅ 지연 요구사항 확인 (실시간 vs 파일 재생)
  • ✅ 비트레이트 예산 확인 (대역폭 제약)
  • ✅ 라이선스 확인 (상용 배포 시)
  • ✅ 무손실 원본 유지 (재압축 방지)

추천 조합

플랫폼비디오오디오컨테이너
웹 (최신)VP9/AV1OpusWebM
웹 (호환)H.264AACMP4
iOS/SafariH.264AACMP4
WebRTCVP8/VP9Opus-
레거시H.264MP3MP4

다음 단계

  • AAC 상세: AAC 완벽 가이드
  • MP3 상세: MP3 실전 가이드
  • Opus 상세: Opus 차세대 오디오

참고 자료

한 줄 정리: 호환성이면 MP3/AAC, 음성·실시간이면 Opus를 기본에 두고 레거시만 MP3로 폴백한다.