AudioTrack
Developer site에 올라온 기본적인 내용은 아래와 같다.
- java 단의 single audio resource를 재생 및 관리
- 재생을 위해 PCM streaming audio buffer를 audio sink에 허가
- "pushing"이라는 액션을 통해 가능하며 AudioTrack 객체에 data를 write 메서드를 이용한다.
AudioTrack에 data write 행위를 pushing이라하며 이것이 결국 audio sink에 pcm stream을 audio buffer를 통해 가능하다는 소리.
- AudioTrack의 두가지 모드 (static/streaming)
- streaming mode 모드에서는 application이 AudioTrack에 stream을 끊임없이 write함. 당연 write 메소드 이용.
- blocking함수이며, java에서 native로 데이터 전송이 끝나고 재생을 위한 큐잉이 끝나면 리턴한다.
- streaming mode가 유용한 경우는 아래와 같다.
- play를 위한 duration이 길어 데이터 사이즈가 너무 크고 메모리에 fit하지 않는 경우.
- audio data특성으로 인해 (high sampling rate, bits per sample ...) 메모리가 부족한 경우.
- 이전 큐된 데이터가 재생 중에 또다른 데이터가 생성 또는 전달 된 경우.
-static mode는 데이터 사이즈가 작아 메모리 fit이 맞는 경우 그리고 가장적은 latency가 가능하도록 재생해야 하는 경우 사용된다.
- AudioTrack 객체가 생성될 떄, 전송을 위한 audio buffer가 초기화 된다.
- 이때 사용된 버퍼 사이즈는 AudioTrack이 데이터가 다 쓰이기전에 재생할 수 있는 기간을 결정하게 된다.
- static mode를 쓰는 AudioTrack은 이 떄 정한 사이즈가 AudioTrack에서 재생할 수 있는 최대 사이즈 이다.
- Streaming mode에서는 audio sink로 최대 버퍼 사이즈보다 작거나 같은 수준으로 chunk data를 쓴다.
AudioTrack 객체 생성은 AudioTrack.Builder를 통해서 진행한다.
예시는 아래와 같으며 크게 다른 내용이 없는 경우엔 그대로 적용가능.
AudioTrack player = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.build())
.setBufferSizeInBytes(minBuffSize)
.build();
출처 :
AudioTrack
https://developer.android.com/reference/android/media/AudioTrack
AudioTrack.Builder
https://developer.android.com/reference/android/media/AudioTrack.Builder#setPerformanceMode(int)
'android' 카테고리의 다른 글
android:process (0) | 2018.08.10 |
---|---|
Immediate Audio Input & Output Android (0) | 2018.07.26 |
MediaPlayer (0) | 2018.07.18 |
Single Fragment 예제 (0) | 2018.07.16 |
Custom Intent로 app 실행하기 (0) | 2018.07.16 |