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;
}
한눈에 : 형식 플래그에'kAudioFormatFlagIsBigEndian'을 추가하십시오. – justin
아쉽게도 재 컴파일시 출력이 변경되었지만 변경되지 않았습니다. –
계획 변경 - 게으르기 때문에 WRAIFFPP와 같은 간단한 라이브러리를 사용하려고합니다. –