2012-08-28 3 views
1

다음 코드를 시도했지만 실행시 'fmt?' '이 파일 형식에서는 데이터 형식이 지원되지 않습니다.'라는 오류가 표시됩니다. 아쉽게도 AIFF에 쓸 경우 AudioStreamBasicDescription을 설정하는 방법을 설명하는 곳에서는 참조를 찾을 수 없습니다.어떻게 coreAudio를 사용하여 정규화 된 부동 소수점 값의 배열을 AIFF에 쓸 수 있습니까?

저는 문제를 봤는데 찾을 수있는 모든 문서를 읽었지만 아무 소용이 없습니다. 아무도 전에 이런 종류의 일을 했습니까? 내가 뭘 잘못하고 있는거야?

// This path is just for testing 
char * filePath = "/Users/user/Desktop/reverb.aiff"; 

// This value will actually be set by earlier code depending on how many mics are defined  
int channels = 1; 

CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL, 
                   (const UInt8 *)filePath, 
                   strlen(filePath), 
                   false); 

AudioStreamBasicDescription audioFileDescription = {0}; 
audioFileDescription.mFormatID   = kAudioFormatLinearPCM; 
audioFileDescription.mFormatFlags  = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsBigEndian; 
audioFileDescription.mBitsPerChannel = sizeof(float) * 8; 
audioFileDescription.mChannelsPerFrame = channels; 
audioFileDescription.mBytesPerFrame = (audioFileDescription.mBitsPerChannel/8) * audioFileDescription.mChannelsPerFrame; 
audioFileDescription.mFramesPerPacket = 1; 
audioFileDescription.mBytesPerPacket = audioFileDescription.mBytesPerFrame * audioFileDescription.mFramesPerPacket; 

AudioFileID audioFileID = 0; 

OSStatus createFileStatus = AudioFileCreateWithURL(audioFileURL, 
                kAudioFileAIFFType, 
                &audioFileDescription, 
                kAudioFileFlags_EraseFile, 
                &audioFileID); 

if (createFileStatus != 0) { 
    cout << "Error creating output file" << endl; 
    cout << "Error code: " << createFileStatus << ", "; 

    // hacky way of converting number back to kinda-readable enum code 
    char chars[5]; 
    for (int i = 3; i >= 0; i--) { 
     chars[i] = (char)createFileStatus; 
     createFileStatus = createFileStatus >> 8; 
    } 
    char[4] = '\0'; 
    cout << chars << endl; 
    return 1; 
} 
+0

한눈에 : 형식 플래그에'kAudioFormatFlagIsBigEndian'을 추가하십시오. – justin

+0

아쉽게도 재 컴파일시 출력이 변경되었지만 변경되지 않았습니다. –

+0

계획 변경 - 게으르기 때문에 WRAIFFPP와 같은 간단한 라이브러리를 사용하려고합니다. –

답변

1

부동 데이터는 AIFF 유형에서 지원되지 않으므로 AIFF-C 파일을 만들어야합니다. 따라서 AudioFileCreateWithURL으로 전화하면 kAudioFileAIFCType을 사용합니다.

빅 엔디안과 부동 소수점은 서로 호환되지 않으므로 bigEndian을 지정하지 마십시오.