코어 오디오 - 오디오 정보 추출

 

 

#.개요

오디오의 관점에서 볼 때 코어 오디오는 소리 자체에 대해서는 잘 모르기 때문에 하이레벨에서 다룬다. 즉 코어 오디오는 하드웨어의 구현 세부사항과 개별적인 오디오 형식의 세부사항을 추상화 한다.

 

 

#.프레임워크

코어오디오는 디지털 오디오를 다루기 위한 프레임워크의 집합이다. 크게 두개로 나눌 수 있다.

 

1.오디오 스트림을 처리하는 오디오 엔진

2.이런 엔진에서 데이터를 넣거나, 빼는 동작이나 다른 방법으로 엔진과 소통하는 도움API

 

 

#.오디오엔진의 종류

 

오디오 유닛

각 유닛은 하드웨어, 콜백함수 등에서 오디오 데이터 버퍼를 받고, 그 데이터에 작업을 하고, 다른 유닛으로 전달한다. 유닛은 여러 오디오 스트림을 하나의 출력으로 합성할 수 있게 하는 많은 입력과 출력을 가질 수 있다. 

 

오디오큐

오디오큐는 시간에 제한되는 i/o 오디오 유닛을 직접 다룰 때 발생하는 스레딩과 관련된 문제에 대한 걱정 없이 오디오를 재생하거나 녹음하는 것을 쉽게 만드는 오디오 유닛 상단의 추상레이어다. 오디오 큐를 가지고 새로운 데이터가 가용될 때마다 입력 장치에서 새로운 데이터의 버퍼를 반복적으로 수신하기 위해서 콜백 함수를 설정함으로써 녹음한다. 오디오 데이터를 가진 버퍼를 채우고 오디오 큐로 전달함으로써 재생한다. 

 

OpenAL

이 API는 위치 기반 3D 오디오를 만들기 위한 산업 표준이며, OpenGL 그래픽스 표준과 비슷한 형태로 디자인 됐다.

 

 

#.도움API의 종류

 

오디오 파일 서비스 (audio file service)

이 프레임워크는 오디오 파일을 위한 여러가지 컨테이너 형식의 세부사항을 추상화 한다.

오디오 파일 서비스 프레임워크는 프로그램이 오디오 파일을 열거나, 그것이 포함한 오디오 데이터의 형식을 얻거나 설정하고 읽기나 쓰기를 시작하게 한다.

 

오디오 파일 스트림 서비스(audio file stream service) 

오디오가 네트워크에서 수신되는 경우, 이 프레임워크는 네트워크 스트림의 오디오 형식을 알아내는 것을 도울 수 있다. 오디오 파일 스트림 서비스 프레임워크는 들어오는 데이터를 재생 엔진에 전달하거나, 다른 형태로 처리하게 해준다.

 

오디오 컨버터 서비스(audio converter service)

이 프레임워크는 AAC나 MP3와 같은 엔코드된 형식과 실제로 오디오 유닛을 통과하는 압축 해제된 가공되지 않은 샘플 간에 변환을 돕는다.

 

확장된 오디오 파일 서비스(extended audio file service)

오디오 변환 서비스와 오디오 파일 스트림 서비스의 조합인 확장된 오디오 파일 API는 오디오 파일에서 읽거나 쓰고, 동시에 변화을 하게 한다.

 

오디오 세션 서비스(audio session service)

ios 에서만 사용되는 오디오 세션 서비스 프레임워크는 앱이 오디오 자원의 사용과 나머지 시스템과 조율할 수 있게 한다. 예를 들어 다른 앱이 재생하고 있을 때 아이팟 오디오가 계속 재생할 수 있는지, 벨소리/음소거 스위치가 앱의 소리를 없애야 하는지를 결정하는 오디오 '범주'를 선언하기 위해서 API를 사용한다.

 

 

#.소스코드 설명

0.코어오디오는 속성기반의 API이다. 속성은 키-값 쌍이며, 키는 정수다. 

kAudioFilePropertyFileFormat = 'ffmt',...

 

1.경로가 있다면 일반적인 C 문자열에서 애플의 여러가지 프레임워크가 사용하는 NSString/CFStringRef 표현으로 변경해야 한다. 

 

2.오디오 파일 API는 파일 경로의 URL 표현으로 동작하고 , 따라서 파일 경로를 NSURL로 변경해야 한다.

 

3.코어 오디오는 오디오 파일 객체를 참조하는 AudioFileID 형식을 사용하기 때문에 지역 변수로써 참조를 선언한다.

 

4.코어 오디오는 OSStauts 형인 반환값을 통해서 성공이나 실패를 전달한다. noErr(0값)을 제외한 다른 상태는 오류를 나타낸다.

 

5.AudioFileOpenURL 함수는 네가지 매개변수인, 경로, 파일권한 플래그, 파일형식힌트, 생성된 AudioFIleId 객체를 수신하기 위한 포인터를 받는다. 

 

6.파일의 메타데이터를 얻기 위해서 메타 속성인 kAudioFilePropertyInfoDictionary를 요청할 것이다. 그러나 이 호출은 사전에 반환되는 메타데이터를 위한 메모리를 할당할 것을 요구한다.

 

7.kAudioFIlePropertyInfoDictionary의 요청은 딕셔너리를 만들기 때문에 CFDictionaryRef 형식의 지역 변수 인스턴스를 설정한다. 필요한 경우 NSDictionary로 형변환 될 수 있다.

 

8.코어 파운데이션은 자동해제를 제공하지 않기 때문에 CFDictionaryRef는 유지카운트 1을 가진다. CFRelease()는 객체를 해제한다.(유지카운트 감소)

 

9.AudioFileID도 해제 되어야 하지만 코어 파운데이션 객체가 아니다. 따라서 CFRelease()로 해제되지 않는다. 대신에 해제 함수인 AudioFIleClose()를 가진다.

 

 

 

#.파일을 열고, 메타데이터에 대한 버퍼를 할당하고, 메타데이터를 갖는 예제

 

Viewcontroller.h

 

Viewcontroller.m

 

출력

 viewDidLoad 진입

 2020-08-05 17:32:58.414453+0900 CoreAudio1[27011:9024736] audio url 경로 : file:///private/var/containers/Bundle/Application/48725B8C-68CD-4994-8550-F54049957D06/CoreAudio1.app/my.mp3

 2020-08-05 17:32:58.537189+0900 CoreAudio1[27011:9024736] AudioFileOpenURL - theErr 1 - 값 : 0

 2020-08-05 17:32:58.537340+0900 CoreAudio1[27011:9024736] AudioFileGetPropertyInfo - theErr 2 - 값 : 0

 2020-08-05 17:32:58.537780+0900 CoreAudio1[27011:9024736] AudioFileGetProperty - theErr 3 - 값 : 0

 2020-08-05 17:32:58.537986+0900 CoreAudio1[27011:9024736] dictionary 값 출력 : {

     album = "YouTube Audio Library";

     "approximate duration in seconds" = "52.82";

     artist = "Kevin MacLeod";

     genre = Cinematic;

     title = "Impact Moderato";

 }

 2020-08-05 17:32:58.538134+0900 CoreAudio1[27011:9024736] AudioFileClose - theErr 4 - 값 : 0

 

 예제파일

CoreAudio1.zip
4.06MB