Posts

Android Audio (6) : 통합 데이터 흐름도 (녹음 + 재생)

Image
  3. 통합 데이터 흐름도 (녹음 + 재생) 아래는 녹음과 재생의 전체 흐름을 통합한 텍스트 기반 다이어그램입니다. 데이터의 이동 방향과 주요 컴포넌트를 보여줍니다. 흐름 설명 녹음 : 마이크에서 아날로그 신호 → Audio HAL → PCM 데이터. AudioFlinger가 PCM을 AudioRecord로 전달. 앱에서 PCM 처리(인코딩, 저장, 스트리밍). 재생 : 파일/스트림 → MediaPlayer/ExoPlayer/AudioTrack → PCM 데이터. AudioFlinger가 PCM을 믹싱 → Audio HAL. AudioSink로 출력(스피커, 헤드셋). 공통 : AudioFlinger: 입력/출력 스트림 믹싱 및 라우팅. Audio HAL: 하드웨어와 소프트웨어 간 데이터 전달. AudioManager: 오디오 포커스, 볼륨, 장치 관리. 4. 주요 컴포넌트와 역할 AudioSource : 입력 소스 선택(마이크, 블루투스 등). AudioRecord : PCM 데이터 캡처(녹음). MediaPlayer/ExoPlayer : 파일/스트림 재생. AudioTrack : PCM 데이터 직접 재생. AAudio/Oboe : 저지연 오디오 처리. AudioFlinger : 오디오 스트림 믹싱 및 라우팅. Audio HAL : 하드웨어 인터페이스. AudioManager : 오디오 제어(볼륨, 포커스, 장치). AudioEffect : 오디오 효과(이퀄라이저, 리버브). AudioAttributes : 스트림 용도 정의. AudioDeviceInfo : 입출력 장치 정보. 5. 추가 고려사항 지연 시간 최적화 : AAudio/Oboe 사용, 버퍼 크기 최소화(getMinBufferSize()). 예: 실시간 오디오 앱(게임, VOIP)에서 10ms 이하 지연 목표. 기기 호환성 : 안드로이드 버전별 API 차이(AAudio: API 26+). 하드웨어 코덱/샘플...

Android Audio (5) : 재생(Playback) 데이터 흐름

  2. 재생(Playback) 데이터 흐름 재생은 파일, 스트림, 또는 PCM 데이터를 디코딩하여 출력 장치(스피커, 헤드셋 등)로 보내는 과정입니다. 단계별 흐름 소스 (파일, 스트림, PCM 데이터) : 데이터: 로컬 파일(MP3, WAV), 원격 스트림(HLS, DASH), 또는 앱 내 PCM 데이터. 예: /sdcard/music.mp3 또는 https://stream.example.com. 앱: MediaPlayer / ExoPlayer / AudioTrack : MediaPlayer : 고수준 API로 파일/스트림 재생. 동작: setDataSource() → prepare() → start(). 데이터: 압축 오디오 → 내부 디코딩 → PCM. ExoPlayer : 적응형 스트리밍 및 커스텀 재생. 동작: MediaSource 설정 → prepare() → play(). 데이터: 스트리밍 데이터 → 디코딩 → PCM. AudioTrack : 저수준 PCM 데이터 재생. 동작: write()로 PCM 버퍼 전달 → play(). 데이터: PCM 데이터 직접 처리. 추가: AudioAttributes로 스트림 용도 지정(예: USAGE_MEDIA). AudioFlinger : 역할: 다중 오디오 스트림을 믹싱하고 출력 장치로 라우팅. 데이터: PCM 데이터를 받아 믹싱(예: 음악 + 알림음). 추가: 이퀄라이저, 리버브 등 AudioEffect 적용 가능. Audio HAL : 역할: 믹싱된 PCM 데이터를 하드웨어(스피커, 블루투스)로 전달. 데이터: PCM → DAC(디지털-아날로그 변환) → 아날로그 신호. 출력 장치 (AudioSink) : 장치: 스피커, 헤드셋, 블루투스(A2DP), HDMI 등. 데이터: 아날로그 신호 → 오디오 출력. 제어: AudioManager.setSpeakerphoneOn() 또는 AudioDeviceInfo로 출력 경로 지정. ...

Android Audio (4) : 녹음(Record) 데이터 흐름

1. 녹음(Record) 데이터 흐름 녹음은 외부 소스(마이크, 스트림 등)에서 데이터를 캡처하여 앱으로 전달하거나 저장/전송하는 과정입니다. 단계별 흐름 외부 소스 (마이크, 블루투스 등) : 데이터: 아날로그 오디오 신호(마이크) 또는 디지털 스트림(블루투스, USB). 예: 마이크에서 소리를 캡처하거나 네트워크 스트림 입력. 입력 장치 (AudioSource) : 소스 선택: AudioSource.MIC, AudioSource.VOICE_COMMUNICATION, AudioSource.REMOTE_SUBMIX 등. 설정: 샘플레이트(예: 44.1kHz), 채널(모노/스테레오), 비트 깊이(16비트 PCM). 데이터: 아날로그 신호 → ADC(아날로그-디지털 변환) → PCM 데이터. Audio HAL (Hardware Abstraction Layer) : 역할: 하드웨어(마이크, 블루투스 장치)와 안드로이드 시스템 간 인터페이스. 데이터: PCM 데이터를 하드웨어에서 시스템으로 전달. 예: 드라이버가 마이크 데이터를 읽어 상위 계층으로 전송. AudioFlinger : 역할: 안드로이드의 오디오 믹서로, 입력 스트림을 처리하고 라우팅. 데이터: PCM 데이터를 수집하여 AudioRecord 또는 AAudio로 전달. 추가: 노이즈 캔슬링, 게인 조절 등 전처리 가능. AudioRecord / AAudio : API: AudioRecord(자바) 또는 AAudio(네이티브, 저지연)로 PCM 데이터 캡처. 동작: AudioRecord.read()로 버퍼에 데이터 저장. 데이터: PCM 데이터 → 앱의 메모리 버퍼. 앱 처리 : 처리: PCM 데이터를 인코딩(예: MediaCodec으로 MP3/AAC), 효과 적용, 실시간 스트리밍. 예: 이퀄라이저 적용, 노이즈 필터링, 또는 WebRTC로 스트리밍. 저장/전송 : 저장: MediaMuxer로 MP4 파일 생성 또는 로컬 스토리지에 PCM ...

Android Audio (3)

Image
  3. 주요 고려사항 지연 시간(Latency) : AAudio/Oboe로 저지연 처리(예: 10ms 이하 목표). 버퍼 크기 최적화 및 하드웨어 지원 확인. 호환성 : 안드로이드 API 레벨별 기능 차이(예: AAudio는 API 26+). 기기별 오디오 하드웨어 차이(코덱, 샘플레이트 지원). 성능 : CPU/메모리 사용 최적화(특히 실시간 처리 시). 백그라운드 서비스로 녹음/재생 지속(ForegroundService 사용). 오디오 포커스 : AudioManager로 앱 간 충돌 방지. 에러 처리 : IllegalStateException, SecurityException 등 예외 처리. 네트워크 스트리밍 시 연결 오류 처리. 4. 추가 정보 고급 기능 : Spatial Audio : API 31+에서 지원, 몰입형 오디오 경험. Bluetooth : A2DP, HFP 프로파일로 오디오 라우팅. OpenSL ES : 네이티브 오디오 처리(C/C++). 디버깅 : Logcat으로 오디오 에러 로그 확인. AudioManager.getDevices()로 디바이스 상태 점검. 5. 예제 코드

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 버퍼 작성. 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() 등으로 출력...

Android Audio (1) : 녹음 (Recording)

1. 오디오 녹음(Recording) 단계 녹음은 외부 소스(마이크, 스트림 등)로부터 오디오 데이터를 캡처하여 앱에서 처리하거나 저장하는 과정입니다. 1.1 입력 소스 선택 AudioSource : 오디오 입력 소스를 정의합니다. 안드로이드에서 지원하는 소스 예: MIC: 일반 마이크 입력. VOICE_COMMUNICATION: 통화에 최적화된 마이크 입력(노이즈 캔슬링 포함). CAMCORDER: 비디오 녹화용 마이크. REMOTE_SUBMIX:ក: 외부 입력 장치(예: 블루투스). 구성 : AudioRecord 객체 생성 시 AudioSource를 지정하여 입력 소스를 선택. 예: AudioRecord(AudioSource.MIC, sampleRate, channelConfig, encoding). 1.2 오디오 데이터 캡처 AudioRecord : 저수준 API로, PCM 형식의 원시 오디오 데이터를 캡처. 설정: 샘플레이트(예: 44.1kHz), 채널(모노/스테레오), 비트 깊이(16비트 PCM 등)를 AudioFormat으로 정의. 동작: AudioRecord.startRecording() 호출 후 read() 메서드로 버퍼에 데이터 저장. 고성능 옵션 : AAudio : API 26+에서 지원, 저지연 처리에 적합. Oboe : AAudio와 OpenSL ES를 추상화한 C++ 라이브러리. 고려사항 : 마이크 권한(RECORD_AUDIO) 요청. 버퍼 크기 최적화로 지연 최소화. 샘플레이트와 하드웨어 호환성 확인. 1.3 데이터 처리 캡처된 PCM 데이터를 앱에서 처리: 인코딩 : PCM을 MP3/AAC로 변환(예: MediaCodec 사용). 저장 : 파일로 저장(예: MediaMuxer로 MP4 컨테이너에 저장). 실시간 처리 : 스트리밍 또는 효과 적용(예: 이퀄라이저). 오디오 포커스 : AudioManager.requestAudioFocus로 다른 앱의 오디오 ...

Android Audio (0) : 안드로이드 오디오

  안드로이드 오디오 시스템의 동작을 큰 그림으로 요약하면, 입력 소스(스트림, 파일, 마이크 등)를 처리하여 재생(play)하거나 녹음(record)하는 과정을 안드로이드의 오디오 프레임워크와 관련 용어 및 경로를 통해 다음과 같이 정리할 수 있습니다. 1. 오디오 입력 및 처리 경로 입력 소스 : 마이크 : AudioRecord를 통해 마이크 입력을 캡처. 파일 : MediaPlayer 또는 ExoPlayer로 로컬/원격 오디오 파일 처리. 스트림 : AudioTrack으로 스트리밍 데이터 처리(예: 네트워크 스트림). 기타 : 블루투스, USB 오디오 등 외부 입력 장치(AudioSource로 정의). 캡처 및 입력 처리 : AudioRecord를 사용하여 PCM 데이터를 캡처. 입력 소스는 AudioSource로 지정(예: MIC, VOICE_COMMUNICATION). 오디오 데이터는 AudioFormat(샘플레이트, 채널, 비트 깊이 등)으로 정의. 2. 오디오 재생 경로 재생 : MediaPlayer: 고수준 API로 파일/스트림 재생(예: MP3, AAC). ExoPlayer: 스트리밍 및 커스텀 재생에 적합. AudioTrack: 저수준 PCM 데이터 직접 재생. 출력은 AudioSink(스피커, 헤드폰, 블루투스 등)로 전달. 오디오 출력 경로 : Audio HAL (Hardware Abstraction Layer): 안드로이드 오디오 프레임워크와 하드웨어 간 인터페이스. AudioFlinger : 오디오 스트림을 믹싱하고 출력 장치로 라우팅. Output Stream : AudioTrack에서 생성된 스트림은 AudioFlinger를 거쳐 하드웨어(스피커, 블루투스 등)로 전달. 3. 주요 안드로이드 오디오 관련 용어 AudioManager : 오디오 모드(전화, 음악 등) 및 볼륨 제어. AudioAttributes : 오디오 스트림의 특성 정의(예: 음악, 알림). ...