Pregunta

Estoy buscando una manera de cambiar el tono del audio grabado a medida que 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), pero hay varias unidades de audio listas para usar, una de las cuales es AUPitch.

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

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

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

Dicho esto, todavía estoy interesado en respuestas de calidad sobre el uso de unidades de audio (en general) en el iPhone.

¿Fue útil?

Solución

Hay algunos recursos muy buenos aquí ( 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 manualmente en la función de devolución de llamada. Al hacerlo, puede encontrar que resuelve su problema.

Otros consejos

Con respecto 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 tono.

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

}

cambiará el tono según el factor

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

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

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

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

Los parámetros para 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 solo necesitará 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top