2009-06-25 15 views
5

Estoy buscando una manera de cambiar el tono del audio grabado mientras se guarda en el disco o se reproduce (en tiempo real). Entiendo que las unidades de audio se pueden usar para esto. El iPhone ofrece soporte limitado para unidades de audio (por ejemplo, no es posible crear/usar unidades de audio personalizadas, por lo que yo sé), pero hay varias unidades de audio listas para usar, una de las cuales es AUPitch.Cómo utilizar una unidad de audio en el iPhone

¿Cómo exactamente usaría una unidad de audio (específicamente AUPitch)? ¿Lo enlazas a una cola de audio de alguna manera? ¿Es posible encadenar unidades de audio juntas (por ejemplo, para agregar simultáneamente un efecto de eco y un cambio en el tono)?

EDITAR: Después de inspeccionar los encabezados de SDK de iPhone (creo que AudioUnit.h, no estoy frente a una Mac en este momento), noté que AUPitch está comentado. Así que no parece que AUPitch esté disponible en el iPhone después de todo. llorar llorar

de Apple parece tener mejor organizada su documentación iPhone SDK en developer.apple.com en los últimos tiempos - ahora es más difícil encontrar referencias a AUPitch, etc.

Dicho esto, yo' m sigue interesado en respuestas de calidad sobre el uso de unidades de audio (en general) en el iPhone.

Respuesta

4

Aquí hay algunos recursos muy buenos (http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/) para usar la unidad de audio RemoteIO. En mi experiencia trabajando con Audio Units en el iPhone, descubrí que puedo implementar una transformación de forma manual en la función de devolución de llamada. Al hacerlo, es posible que encuentre que eso resuelve su problema.

1

En cuanto al cambio de tono en el iPhone, OpenAL es el camino a seguir. Consulte la clase SoundManager disponible en www.71squared.com para obtener un excelente ejemplo de un motor de sonido OpenAL que admite el tono.

+0

Tenga en cuenta que OpenAL solo admite el cambio de tono de audio en tiempo real, lo que significa que no puede guardar el audio alterado – hyd00

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

} 

que va a cambiar de tono basado en el factor

0

He usado la unidad de audio NewTimePitch de esto antes, la descripción del componente de audio para que sea

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

entonces usted puede cambiar el tono parámetro con una llamada AudioUnitSetParamater. Por ejemplo, esto cambia el tono de -1000 centavos

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

Los parámetros de esta unidad de audio son los siguientes

// 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 
}; 

pero lo único que necesita para cambiar el parámetro de tono para sus propósitos. Para obtener una guía sobre cómo implementar esto, consulte la respuesta de Justin

Cuestiones relacionadas