본문 바로가기
ios 뽀개기/objective-c

ios objective c 코어오디오 다루기 1

by 인생여희 2018. 11. 6.
반응형

ios objective c 코어오디오 다루기 1



오디오 파일을 불러와서 속성 정보를 출력하는 간단한 로직이다.

코어오디오 api를 사용하기 위해서 AudioToolbox 라이브러리를 추가해줘야한다.

(왼쪽 네비게이션에서 프로젝트 아이콘 클릭 -> Build Phasses -> Link Binary With Libraries -> + 버튼 클릭 -> 찾아서 추가해줌)


//

//  main.m

//  1

//

//  Created by service on 2018. 11. 6..

//  Copyright © 2018년 service. All rights reserved.

//

/*

 파일을 열고,

 메타데이터에 대한 버퍼 할당

 메타데이터를 갖는다.

 */

#import <Foundation/Foundation.h>

#import <AudioToolbox/AudioToolbox.h>

//파일경로 : "~/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/test_cbr.mp3"

//editschema 를열고 위의 파일 경로를 인자로 넣어준다.

//첫번째 문자열 : 실행파일의 이름, 두번째 문자열: 오디오 파일의 경로

int main(int argc, const char * argv[]) {

    


    @autoreleasepool {

        //오디오 파일의 경로 확인

        if (argc < 2) {

            printf("usage: CAMetadata /full/path/to/audiofile\n");

            return -1;

        }

        

        //경로가 있다면 여러가지 애플의 프레임워크에서 사용하는 nsstring 으로 변환.홈디렉토리의 단축형인 틸드 문자를 ~/music/ 같이 수용

        NSString *audioFilePath = [[NSString stringWithUTF8String:argv[1]] stringByExpandingTildeInPath];

        

        //오디오 파일 api는 파일 경로의 url 표현으로 동작한다.

        NSURL *audioURL =  [NSURL fileURLWithPath:audioFilePath];

        

        NSLog(@"audioURL - 경로 : %@" , audioURL);

      

        //코어 오디오는 오디오 파일 객체를 참조하는 audioFileID형식을 사용하기때문에 지역변수 선언

        AudioFileID audioFile;

        //코어 오디오 함수는 ossstatus형인 반환 값을 통해서 성공,실패전달. noErr(0값)을 제외한 다른 상태는 오류

        OSStatus theErr = noErr;

        

        //첫번째 코어오디오 함수: CFURLRef , 파일권한 플래그, 파일형식 힌트, AudioFileID의 포인터를 인자로 받는다.

        theErr = AudioFileOpenURL((__bridge CFURLRef)audioURL, kAudioFileReadPermission, 0, &audioFile);

        NSLog(@"theErr - 값 : %d" , (int)theErr);    //0

        //오류나면 종료

        assert(theErr == noErr);

        

        

        //파일의 메타데이터를 얻기위해서 kAudioFilePropertyInfoDictionary호출 할것이다.

        //사전에 반환되는 메타데이터를 위한 메모리를 할당할 지역변수 선언

        UInt32 dictionarySize = 0;

        //필요한 크기를 얻기위해 audiofileid, 속성, 결과를 받을 포인터, 속성이 쓰기 가능한 여부를 나타내는 플래그 변수를 전달.

        theErr = AudioFileGetPropertyInfo(audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, 0);

        assert(theErr == noErr);

        

        

        CFDictionaryRef dictionary;

        //속성을 요청할 준비가 됨.

        theErr = AudioFileGetProperty(audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, &dictionary);

        assert(theErr == noErr);

        

        

        NSLog(@"dictionary 값출력 : %@", dictionary);

        CFRelease(dictionary);

        theErr = AudioFileClose(audioFile);

        assert(theErr == noErr);

        

        

        /*

         출력내용:

         2018-11-06 10:35:46.640373+0900 1[703:115853]

            audioURL - 경로 : file:///Users/service/Music/iTunes/iTunes%20Media/Music/Unknown%20Artist/Unknown%20Album/test_cbr.mp3

         2018-11-06 10:35:46.641179+0900 1[703:115853]

            dictionary 값출력 : {

                "approximate duration in seconds" = "52.86";

            }

         

         

         */

        

    }

    

    

    

    

    

    

    return 0;

}

반응형

댓글