Domanda

Sto cercando un modo per cambiare il tono dell'audio registrato mentre viene salvato su disco o riprodotto (in tempo reale). Capisco che le unità audio possono essere utilizzate per questo. L'iPhone offre un supporto limitato per le unità audio (ad esempio non è possibile creare / utilizzare unità audio personalizzate, per quanto posso dire), ma sono disponibili diverse unità audio pronte all'uso, una delle quali è AUPitch.

Come userei esattamente un'unità audio (in particolare AUPitch)? Lo agganci in una coda audio in qualche modo? È possibile concatenare le unità audio insieme (ad esempio, per aggiungere contemporaneamente un effetto eco e una modifica del tono)?

EDIT: dopo aver ispezionato le intestazioni dell'SDK per iPhone (penso che AudioUnit.h, al momento non sono di fronte a un Mac), ho notato che AUPitch è stato commentato. Dopotutto non sembra che AUPitch sia disponibile su iPhone. piangi piangi

Apple sembra aver organizzato meglio la documentazione dell'SDK per iPhone su developer.apple.com negli ultimi tempi - ora è più difficile trovare riferimenti ad AUPitch, ecc.

Detto questo, sono ancora interessato a risposte di qualità sull'uso delle unità audio (in generale) su iPhone.

È stato utile?

Soluzione

Ci sono alcune ottime risorse qui ( http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/ ) per l'utilizzo dell'unità audio RemoteIO. Nella mia esperienza di lavoro con le unità audio su iPhone, ho scoperto che posso implementare manualmente una trasformazione nella funzione di richiamata. In tal modo, potresti scoprire che risolve il problema.

Altri suggerimenti

Per quanto riguarda il cambio di tonalità su iPhone, OpenAL è la strada da percorrere. Scopri la classe SoundManager disponibile da www.71squared.com per un ottimo esempio di un motore audio OpenAL che supporta il pitch.

- (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);

}

cambierà il tono in base al fattore

Ho usato l'unità audio NewTimePitch per questo prima, la descrizione del componente audio per questo è

var newTimePitchDesc = AudioComponentDescription(componentType: kAudioUnitType_FormatConverter,
        componentSubType: kAudioUnitSubType_NewTimePitch,
        componentManufacturer: kAudioUnitManufacturer_Apple,
        componentFlags: 0,
        componentFlagsMask: 0)

quindi è possibile modificare il parametro del pitch con una chiamata AudioUnitSetParamater. Ad esempio, questo cambia il tono di -1000 centesimi

err = AudioUnitSetParameter(newTimePitchAudioUnit,
        kNewTimePitchParam_Pitch,
        kAudioUnitScope_Global,
        0,
        -1000,
        0)

I parametri per questa unità audio sono i seguenti

    // Parameters for AUNewTimePitch
enum {
      // Global, rate, 1/32 -> 32.0, 1.0
  kNewTimePitchParam_Rate                         = 0,
      // Global, Cents, -2400 -> 2400, 1.0
  kNewTimePitchParam_Pitch                        = 1,
      // Global, generic, 3.0 -> 32.0, 8.0
  kNewTimePitchParam_Overlap                      = 4,
      // Global, Boolean, 0->1, 1
  kNewTimePitchParam_EnablePeakLocking            = 6
};

ma dovrai solo modificare il parametro pitch per i tuoi scopi. Per una guida su come implementarlo, fai riferimento alla risposta di Justin

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top