2013-07-04 2 views
1

파일 샘플 속도를 수정하지 않고 WAV 파일에서 원시 오디오 샘플 (가장 이상적으로는 플로트)을 얻는 가장 간단한 방법은 무엇입니까?WAV 파일에서 원시 오디오 샘플 읽기

나는 https://stackoverflow.com/a/4572990/1116197에있는 예제를 따라 갔지만 그 다음으로는 buffer에서 플로트를 추출하는 방법을 모르겠습니다. 그냥 buffer[n]하는 것은 작동하지 않습니다. basicDescription.mFormatFlags에 따르면 파일 내가 대신 ExtAudioFileRef를 사용하여 (float들로) 데이터를 추출 할 관리했습니다 kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

입니다,하지만 당신이 원하는 출력 형식을 지정해야합니다,하지만 난을 변경하지 않으 sampleRate. 예 : A file’s data format. Value is a read-only AudioStreamBasicDescription struct. - - 그래서 나는 할 수 없습니다 당신은 내가 처음 ExtAudioFileGetProperty를 사용하여 사용하여 파일을 AudioStreamBasicDescription 얻을 수 추측하지만, 애플의 워드 프로세서 (http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html)에 따라 내가 필요로하는 속성 ID는 읽기 전용 kExtAudioFileProperty_FileDataFormat입니다

AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate = 44100; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; 
audioFormat.mBitsPerChannel = sizeof(Float32) * 8; 
audioFormat.mChannelsPerFrame = 1; // Mono 
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(Float32); // == sizeof(Float32) 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; // = sizeof(Float32) 


ExtAudioFileSetProperty(
    fileRef, 
    kExtAudioFileProperty_ClientDataFormat, 
    sizeof (AudioStreamBasicDescription), 
    &audioFormat 
), 

을 수행 할 수 있습니다 그것을 추가 수정하십시오 mFormatFlags = kLinearPCMFormatFlagIsFloat

그래서 내가 할 수있는 위의, 그리고 새로운 ASBD를 만들고 모든 것을 복사 할 것 같아요,하지만 모두가 너무 복잡해 보인다 그래서 내가 잘못된 트리를 짖는 지 궁금해. 전적으로? 이 작업을 수행하는 더 간단한 방법이 있습니까?!

답변

0

발견 한 것처럼 먼저 파일의 데이터 형식을 가져온 다음 파일의 샘플 속도로 원하는 샘플 크기 및 유형으로 클라이언트 데이터 형식을 만들어야합니다. 그것은 Core Audio의 세계에서 그다지 많지 않은 하나의 추가 함수 호출로 귀결됩니다.

+0

나는이 접근 방식으로 갈 것이다, 고마워! – Mark

2

가장 일반적인 .WAV 파일은 44 바이트 헤더와 16 비트 또는 2 바이트 리틀 엔디안 원시 PCM 오디오 샘플입니다. 리틀 엔디안 CPU (x86, ARM 등)에서 이러한 유형의 파일 중 하나를 사용하는 경우 처음 44 바이트를 건너 뛰고 짧은 int를 읽고 float으로 변환하면됩니다.

+2

Apple은 44 바이트 헤더를 사용하지 않습니다. –

+0

iOS는 44 바이트 헤더 RIFF/.wav 파일을 저장, 재생 및 읽습니다. API에 따라 해당 형식으로 파일을 만들지는 못하지만 다른 질문입니다. – hotpaw2

관련 문제