Android Audio (2) : 재생 (Playback)
2. 오디오 재생(Playback) 단계
재생은 파일, 스트림, 또는 저장된 데이터를 출력 장치(스피커, 헤드셋 등)로 보내는 과정입니다.
2.1 입력 소스 준비
- 소스 종류:
- 로컬 파일: MP3, WAV, AAC 등(예: /storage/emulated/0/music.mp3).
- 원격 스트림: HTTP/RTSP 스트림(예: 인터넷 라디오).
- PCM 데이터: 앱 내에서 생성된 원시 데이터.
- API 선택:
- MediaPlayer: 고수준 API, 파일/스트림 재생에 적합.
- 예: MediaPlayer.setDataSource(path) → prepare() → start().
- ExoPlayer: 적응형 스트리밍(HLS, DASH) 및 커스텀 재생에 최적.
- 예: SimpleExoPlayer로 MediaSource 설정.
- AudioTrack: PCM 데이터 직접 재생(저수준).
- 예: AudioTrack.write()로 PCM 버퍼 작성.
- MediaPlayer: 고수준 API, 파일/스트림 재생에 적합.
2.2 오디오 디코딩
- 디코딩: 압축된 오디오 파일(MP3, AAC 등)을 PCM으로 변환.
- MediaPlayer/ExoPlayer는 내부적으로 디코딩 처리.
- MediaCodec: 저수준 디코딩 시 사용(예: MP3 → PCM).
- 고려사항:
- 코덱 호환성 확인(안드로이드 기기별 지원 코덱 다름).
- DRM 처리(예: Widevine for protected content).
2.3 오디오 믹싱 및 출력
- AudioFlinger: 안드로이드의 오디오 믹서로, 여러 스트림을 믹싱.
- AudioAttributes: 스트림 용도 정의(예: USAGE_MEDIA, USAGE_ALARM).
- AudioEffect: 이퀄라이저, 리버브 등 효과 적용 가능.
- 출력 장치:
- AudioDeviceInfo: 스피커, 헤드셋, 블루투스 등 출력 장치 정보.
- AudioManager.setSpeakerphoneOn() 등으로 출력 경로 제어.
- Audio HAL: 하드웨어와의 인터페이스.
- 예: PCM 데이터가 HAL을 통해 스피커로 전달.
2.4 오디오 포커스 및 제어
- AudioFocus: AudioManager.requestAudioFocus로 재생 우선권 확보.
- 예: 음악 재생 중 전화가 오면 onAudioFocusLoss로 일시 중지.
- 볼륨 제어: AudioManager.adjustStreamVolume으로 볼륨 조절.
- 지연 최소화:
- AAudio 또는 Oboe로 저지연 재생(예: 게임, 실시간 오디오 앱).
- 버퍼 크기 최적화(예: AudioTrack.getMinBufferSize()).
2.5 오디오 처리 흐름 상세
- 소스 설정:
- MediaPlayer.setDataSource() 또는 ExoPlayer.prepare(MediaSource).
- 디코딩: 코덱을 통해 PCM 데이터 생성.
- AudioFlinger로 전달: AudioTrack 또는 내부 처리로 믹싱.
- 출력: AudioSink를 통해 스피커/헤드셋으로 출력.
- 제어: AudioFocus, 볼륨, 재생 상태 관리(play(), pause()).
Comments
Post a Comment