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) 및 커스텀 재생에 최적.
      • 예: SimpleExoPlayerMediaSource 설정.
    • AudioTrack: PCM 데이터 직접 재생(저수준).
      • 예: AudioTrack.write()로 PCM 버퍼 작성.

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 오디오 처리 흐름 상세

  1. 소스 설정:
    • MediaPlayer.setDataSource() 또는 ExoPlayer.prepare(MediaSource).
  2. 디코딩: 코덱을 통해 PCM 데이터 생성.
  3. AudioFlinger로 전달: AudioTrack 또는 내부 처리로 믹싱.
  4. 출력: AudioSink를 통해 스피커/헤드셋으로 출력.
  5. 제어: AudioFocus, 볼륨, 재생 상태 관리(play(), pause()).

Comments

Popular posts from this blog

TinyZero 따라하기 (1)

TinyZero 따라하기 (3)

TinyZero 따라하기 (2)