본문 바로가기
Dev.Mobile/iPhone

[iOS] Audio Coding How-To's (From developer.apple.com)

by Devkin 2011. 10. 26.

Referenced from Audio & Video Coding How-To's

Translated by metalkin


Audio Recording


내장 마이크로부터 오디오 녹음

Audio Queue Services (AudioToolbox/AudioQueue.h) 와 Audio File Services (AudioToolbox/AudioFile.h) 의 인터페이스를 사용. 상세 내용과 샘플코드는  Audio Queue Services Programming Guide 참고.

헤드폰 마이크로부터 오디오 녹음
사용자가 마이크 내장된 헤드폰을 디바이스에 꽂을 경우, 디바이스 시스템이 자동으로 내장 마이크 대신 헤드폰 마이크의 음성을 사용.

녹음 입력 레벨 조정
iPhone OS는 고정된 녹음 입력 레벨을 사용.
(주. iOS 5 부터 코딩으로 녹음 입력 레벨 조정 지원함. 해당 포스트 참조.)

녹음 레벨의 표시
Audio Queue Object(from Audio Queue Services, AudioToolbox/AudioQueue.h)  를 녹음에 사용한다면, 
kAudioQueueProperty_EnableLevelMetering 프로퍼티를 true 로 설정하고, 현재 녹음 레벨을 얻기 위해 Audio Queue Object의 kAudioQueueProperty_CurrentLevelMeter 프로퍼티의 정보 요청. 일반적으로 타이머를 이용하여 초당 10회 정도 요청. Listing 1. 을 보면, kAudioQueueProperty_CurrentLevelMeter 의 값은 채널당 하나로 할당되는 AudioQueueLevelMeterState 구조체의 배열.

Listing 1 AudioQueueLevelMeterState 구조체
### cpp
typedef struct AudioQueueLevelMeterState {
   Float32 mAverragePower;
   Float32 mPeakPower;
} AudioQueueLevelMeterState;


Playback



짧은 사운드 또는 경고음 재생

AudioToolbox/AudioServices.h  에 정의된 System Audio Services 를 사용하여 30초 미만의 사용자 정의(등록) 사운드 재생 가능. 사용자 정의(등록)된 사운드에 한하며, iPhone OS 에 내장된 경고음을 재생할 수는 없음.

사용자 정의(등록)된 사운드를 재생하기 위해서는,
 

1. 사운드 파일을 어플리케이션 번들(주. xCode 프로젝트의 Resources 디렉토리 아래)에 추가하고 해당 사운드 파일은 아래 요구사항을 만족하여야 함.
  • 반드시 .caf, .aif, .wav 파일이여야 함.
  • 해당 파일의 오디오 데이터는 PCM 또는 IMA/ADPCM(IMA4) 포맷이여야 함.
  • 해당 파일의 재생시간은 반드시 30초 미만이여야 함. 

2. Listing 2. 에서 처럼 Sound ID 오브젝트를 생성.

Listing 2  Sound ID 오브젝트 생성
### cpp
AudioServicesCreateSystemSoundID (fileURL, soundID)
3. 사운드 재생

Listing 3 사운드 재생

### cpp
AudioServicesPlaySystemSound (soundID);
사운드 재생에 관한 더 많은 정보는 iOS Application Programming Guide 를 참고. Apple Core Audio Format(.caf)에 관해서는 Core Audio Overview 문서와 Audio UI Sounds(SysSound) 샘플 코드를 참고.

만일, 30초 이상의 오디오 파일을 재생하거나 오디오 레벨 조정이 필요할 경우에는 AVAudioPlayer 클래스를 사용. 스케쥴에 따른 재생이 필요하다면, Audio Queue Services 를 사용.

재생 볼륨 제어
iPhone 과 2세대 iPod touch 에서는 사용자가 하드웨어 볼륨 컨트롤을 이용하여 볼륨 제어. Audio Queue Services(AudioToolbox/AudioQueue.h) 를 이용하여 사운드 재생시 상대적인 재생 볼륨 제어 가능. 상대적인 재생 볼륨 제어를 위해서는 재생 audio queue object를 생성하고 kAudioQueueParam_Volume 파라미터와 함께 AudioQueueSetParameter 펑션을 사용.
System Audio Services, AudioToolbox/AudioServices.h, 는 볼륨 제어를 제공하지 않음.

재생 볼륨 표시
재생 시 audio queue object (from Audio Queue Services, AudioToolbox/AudioQueue.h)를 사용할 시, kAudioQueueProperty_EnableLevelMetering 퍼라퍼티를 true 로 설정하고, 현재 재생 볼륨을 얻기 위해 audio queue object 의 kAudioQueueProperty_CurrentLevelMeter 프라퍼티의 값을 취득. 일반적으로 반복 타이머를 사용하여 초당 10번정도의 재생 볼륨값을 요청. kAudioProperty_CurrentLevelMeter 의 값은 채널 하나당 AudioQueueLevelMeterState 구조체의 배열.(Listing 4.)

Listing 4 AudioQueueLevelMeterState 구조체
### cpp
typedef struct AudioQueueLevelMeterState {
   Float32 mAveragePower;
   Float32 mPeakPower;
} AudioQueueLevelMeterState;


임의 길이의 사운드 파일 재생
Audio File Services(AudioToolbox/AudioFile.h) 와 함께, Audio Queue Services(AudioToolbox/AudioQueue.h) 인터페이스를 사용. Audio Queue Services 를 사용하여 사운드 재생 시, 짧은 단위의 오디오 데이터를 audio queue buffers 에 전달하는 Callback 을 정의하여 사용. 어떤 경우에는 디스크 접근을 최소화 하기 때문에, 사운드 파일 전체를 메모리에 로드하여 재생하는 것이 가장 적절하고, 한편으론 버퍼를 채우기 위해 충분한 데이터만 한번에 로드하는 것이 적절할 경우도 있음. 테스트를 통해 해당 어플리케이션에서 가장 적절한 정책을 사용.

추가정보는 iOS Application Programming Guide 의 "Multimedia Support" 와 Audio Queue Services Programming Guide 를 참고.

여러 사운드를 동시에 재생
Audio Queue Services(AudioToolbox/AudioQueue.h) 의 인터페이스를 사용. 재생할 각각의 사운드 당 하나의 audio queue object 를 생성하고, AudioQueueEnqueueBufferWithParameters 펑션을 사용하여 각각의 audio queue 의 첫번째 오디오 버퍼의 재생 시작 시점을 동일하게 지정.

오디오 데이터 포맷에 따라 iPhone OS 에서의 동시 재생은 다음과 같은 제약사항이 존재 :
  • AAC, MP3, ALAC(Apple Lossless) : 동시 재생 가능하나 디코딩 시, CPU 자원을 소모.
  • Linear PCM, IMA/ADPCM(IM4 audio) : CPU 자원 소모 걱정없이 동시 재생 가능.

iPhone OS 에 가장 적절한 오디오 포맷 선택
iPhone, iPod touch 에서의 모든 오디오 재생은 CPU 효율과 배터리 시간을 고려하여 Apple 에서는 다음 사항을 권고
  • 비압축 오디오로는 16-bit, little-endian, linear PCM 오디오 포맷의 CAF 파일 사용.
  • 동시에 여러 압축 오디오 재생이 필요할 시, IMA/ADPCM(IMA4) 오디오 포맷 사용.
  • 한번에 단일 압축 오디오 재생이 필요할 시, ALAC(Apple Lossless), AAC, MP3, IMA4 사용.

동시에 오디오 녹음과 재생
iPhone 에서 동시성과 Low-latency 오디오 입출력을 위해, I/O audio unit 사용.
### cpp
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

오디오 레이턴시 최소화
게임의 사운드 이펙트 또는 사용자 반응 시간이 중요한 어플르케이션에서 처럼, 즉각적인 재생이 중요한 경우라면 IO Remote audio unit 을 직접 사용. 또한, low-latency 를 위해 IO Remote audio unit 을 사용하는 iPhone OS 의 OpenAL 도 사용 가능.

iPhone 의 진동 구동
System Audio Services(AudioToolbox/AudioServices.h) 사용. kSystemSoundID_Vibrate 상수와 함께 AudioServicesPlaySystemSound 펑션을 호출하면, 고정되어 있는 기간동안 진동 작동.


Streaming


스트림 오디오 재생
CFHttpMessage 에서처럼, Core Foundation 의 CFNetwork 인터페이스를 사용하여 네트워크에 연결하고 Audio File Stream Services(AudioToolbox/AudioFileStream.h) 를 사용하여 네트워크 패킷을 오디오 패킷으로 파싱(Parsing)하여 Audio Queue Services(AudioToolbox/AudioQueue.h) 로 오디오 패킷 재생.
또한, 디스크 저장된 파일의 오디오 패킷을 파싱하는데 Audio File Stream Services 사용 가능.


Processing


iPhone OS 선호 포맷으로의 오디오 파일 변환

16-bit, little-endian, linear PCM 포맷의 CAF 파일이 iPhone OS 에서 선호되는 오디오 포맷. 오디오 파일을 이 형식으로 변환하기 위해서는 Mac OS X 의 커맨드 라인에서 afconvert 툴을 사용.

Listing 5 오디오 파일의 iPhone OS 선호 포맷으로의 변환
### cpp
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}
모든 제공 옵션을 보려면, 커맨드 라인에서 afconvert -h 입력.

iPhone OS 의 내장 audio unit 사용
iPhone OS 는 다음 세가지의 audio unit 을 제공 : Convert unit (AUConverter), 3D Embedded Mixer unit (AU3DEmbeddedMixer), IO Remote unit (AUIORemote).
Audio Unit Framwork 를 이용하여 open, connet, use audio units.
iPhone OS 에서는 audio unit 생성을 지원하지 않음.


Audio Hardware


하드웨어 볼륨 컨트롤러 접근

어플리케이션의 볼륨을 포함한 전역 시스템 볼륨은 iPhone OS 에 의해 제어되며, 어플리케이션에 의해 접근 불가.

오디오 재생 장치(내장 스피커, 독 커넥터, 헤드폰) 제어
사용자 설정에 따라, iPhone OS 가 적절한 장치로 오디오 재생 (주. 헤드폰 또는 독 커넥터로 스피커 플러그인 시, 해당 장치로 재생)

독 커넥터의 오디오 입/출력 접근
iPhone 어플리케이션은 독 커넥터로의 직접 접근 불가. 사용자가 악세사리를 독 커넥터에 연결할 때, 시스템에서 해당 악세사리를 자동으로 오디오 녹음/재생 가능하게 설정.



© 2010 Apple Inc. All Rights Reserved.



반응형

댓글