How to use an Audio Unit on the iPhone

前端 未结 4 1064
谎友^
谎友^ 2021-02-04 20:41

I\'m looking for a way to change the pitch of recorded audio as it is saved to disk, or played back (in real time). I understand Audio Units can be used for this. The iPhone off

4条回答
  •  后悔当初
    2021-02-04 21:23

    - (void)modifySpeedOf:(CFURLRef)inputURL byFactor:(float)factor andWriteTo:(CFURLRef)outputURL {
    
        ExtAudioFileRef inputFile = NULL;
        ExtAudioFileRef outputFile = NULL;
    
        AudioStreamBasicDescription destFormat;
    
        destFormat.mFormatID = kAudioFormatLinearPCM;
        destFormat.mFormatFlags = kAudioFormatFlagsCanonical;
        destFormat.mSampleRate = 44100 * factor;
        destFormat.mBytesPerPacket = 2;
        destFormat.mFramesPerPacket = 1;
        destFormat.mBytesPerFrame = 2;
        destFormat.mChannelsPerFrame = 1;
        destFormat.mBitsPerChannel = 16;
        destFormat.mReserved = 0;
    
        ExtAudioFileCreateWithURL(outputURL, kAudioFileCAFType,
                                  &destFormat, NULL, kAudioFileFlags_EraseFile, &outputFile);
    
        ExtAudioFileOpenURL(inputURL, &inputFile);
    
        //find out how many frames is this file long
        SInt64 length = 0;
        UInt32 dataSize2 = (UInt32)sizeof(length);
        ExtAudioFileGetProperty(inputFile,
                                kExtAudioFileProperty_FileLengthFrames, &dataSize2, &length);
    
        SInt16 *buffer = (SInt16*)malloc(kBufferSize * sizeof(SInt16));
    
        UInt32 totalFramecount = 0;
    
        AudioBufferList bufferList;
        bufferList.mNumberBuffers = 1;
        bufferList.mBuffers[0].mNumberChannels = 1;
        bufferList.mBuffers[0].mData = buffer; // pointer to buffer of audio data
        bufferList.mBuffers[0].mDataByteSize = kBufferSize *
        sizeof(SInt16); // number of bytes in the buffer
    
        while(true) {
    
            UInt32 frameCount = kBufferSize * sizeof(SInt16) / 2;
            // Read a chunk of input
            ExtAudioFileRead(inputFile, &frameCount, &bufferList);
            totalFramecount += frameCount;
    
            if (!frameCount || totalFramecount >= length) {
                //termination condition
                break;
            }
            ExtAudioFileWrite(outputFile, frameCount, &bufferList);
        }
    
        free(buffer);
    
        ExtAudioFileDispose(inputFile);
        ExtAudioFileDispose(outputFile);
    
    }
    

    it will change pitch based on factor

提交回复
热议问题