有没有办法在 swift/objective-c 中将 .wav 文件读取为 float/int 数组,并在处理样本后将其输出到扬声器或存储为 pcm?

Abh*_*gal 5 xcode objective-c core-audio ios swift

我正在尝试构建一个 iOS 应用程序,我需要将 .wav 文件或麦克风输入读取为浮点数或 int 数组,以提供给 C 中现有的音频信号处理算法。 有没有像 matlab 中的 wavread 那样的简单方法?

void readAudio() {


NSString * name = @"Test";
NSString * source = [[NSBundle mainBundle] pathForResource:name ofType:@"caf"];
const char * cString = [source cStringUsingEncoding:NSASCIIStringEncoding];
CFStringRef str = CFStringCreateWithCString(NULL, cString, kCFStringEncodingMacRoman);
CFURLRef inputFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, str, kCFURLPOSIXPathStyle, false);

AudioFileID fileID;
OSStatus err = AudioFileOpenURL(inputFileURL, kAudioFileReadPermission, 0, &fileID);
CheckError(err, "AudioFileOpenURL");

ExtAudioFileRef fileRef;
err = ExtAudioFileOpenURL(inputFileURL, &fileRef);
CheckError(err, "ExtAudioFileOpenURL");


AudioStreamBasicDescription clientFormat;
memset(&clientFormat, 0, sizeof(clientFormat));
clientFormat.mFormatID          = kAudioFormatLinearPCM;
clientFormat.mFramesPerPacket   = 1;
clientFormat.mChannelsPerFrame  = 1;
clientFormat.mBitsPerChannel    = 16;
clientFormat.mBytesPerPacket    = clientFormat.mChannelsPerFrame * sizeof(SInt16);
clientFormat.mBytesPerFrame     = clientFormat.mChannelsPerFrame * sizeof(SInt16);
clientFormat.mFormatFlags       = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
clientFormat.mSampleRate        = 8000;

err = ExtAudioFileSetProperty(fileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &clientFormat);
CheckError(err, "ExtAudioFileSetProperty");


int numSamples = 64;
UInt32 sizePerPacket = clientFormat.mBytesPerPacket;
UInt32 packetsPerBuffer = numSamples;
UInt32 outputBufferSize = packetsPerBuffer * sizePerPacket;

UInt8 *outputBuffer = (UInt8 *)malloc(sizeof(UInt8 *) * outputBufferSize);

AudioBufferList convertedData;

convertedData.mNumberBuffers = 1;
convertedData.mBuffers[0].mNumberChannels = clientFormat.mChannelsPerFrame;
convertedData.mBuffers[0].mDataByteSize = outputBufferSize;
convertedData.mBuffers[0].mData = outputBuffer;

UInt32 frameCount = numSamples;
short *samplesAsCArray, *output = (short *)malloc(sizeof(UInt8 *) * numSamples);

while (frameCount > 0) {
    err = ExtAudioFileRead(fileRef, &frameCount, &convertedData);
    if(frameCount > 0) {

        uint64_t startTime = mach_absolute_time()   ;

        AudioBuffer audioBuffer = convertedData.mBuffers[0];
        samplesAsCArray = (short *)audioBuffer.mData;
        FIRFilter(samplesAsCArray, audioBuffer.mDataByteSize/(sizeof(short)), output);


        memcpy([iosAudio tempBuffer].mData, output, audioBuffer.mDataByteSize);


        uint64_t duration = mach_absolute_time() - startTime;

        NSLog(@"%f milliseconds", (float)duration/1e6);

        /*for (int i =0; i< frameCount; i++) {
         printf("%d\n", output[i]);
         }*/

    }
}

free(output);
Run Code Online (Sandbox Code Playgroud)

}

到目前为止,我已经实施了很多。我需要能够将编辑后的文件保存为线性 PCM(CAF,因为苹果在这方面效果更好),作为文本并能够实时播放编辑后的音频。