Quiero leer un archivo de sonido del paquete de aplicaciones, copiarlo, reproducirlo con su nivel de volumen máximo (valor de ganancia o potencia máxima, no estoy seguro del nombre técnico del mismo), y luego escribirlo como otro archivo en el paquete de nuevo.Procesamiento de audio: Reproducción con nivel de volumen
Hice la parte de copiar y escribir. El archivo resultante es idéntico al archivo de entrada. Utilizo las funciones AudioFileReadBytes() y AudioFileWriteBytes() de los servicios de AudioFile en AudioToolbox framework para hacer eso.
Por lo tanto, tengo los bytes del archivo de entrada y también su formato de datos de audio (mediante el uso de AudioFileGetProperty() con kAudioFilePropertyDataFormat) pero no puedo encontrar una variable para reproducir con el nivel de volumen máximo del archivo original.
Para aclarar mi propósito, estoy tratando de producir otro archivo de sonido cuyo nivel de volumen se incrementa o disminuye en relación con el original, por lo que no me importa el nivel de volumen del sistema que el usuario o iOS.
¿Es eso posible con el marco que mencioné? Si no, ¿hay alguna sugerencia alternativa?
Gracias
edición: Caminando a través de la respuesta de Sam con respecto a algunos conceptos básicos de audio, me decidieron ampliar la pregunta con otra alternativa.
¿Puedo usar los servicios de AudioQueue para grabar un archivo de sonido existente (que está en el paquete) en otro archivo y reproducirlo con el nivel de volumen (con la ayuda de framework) durante la fase de grabación?
actualización: Así es como estoy leyendo el archivo de entrada y escribir la salida. El siguiente código baja el nivel de sonido para "algunos" de los valores de amplitud pero con mucho ruido. Curiosamente, si elijo 0.5 como valor de amplitud, aumenta el nivel de sonido en lugar de bajarlo, pero cuando uso 0.1 como valor de amplitud, baja el sonido. Ambos casos implican un ruido molesto. Creo que es por eso que Art habla de normalización, pero no tengo idea sobre la normalización.
AudioFileID inFileID;
CFURLRef inURL = [self inSoundURL];
AudioFileOpenURL(inURL, kAudioFileReadPermission, kAudioFileWAVEType, &inFileID)
UInt32 fileSize = [self audioFileSize:inFileID];
Float32 *inData = malloc(fileSize * sizeof(Float32)); //I used Float32 type with jv42's suggestion
AudioFileReadBytes(inFileID, false, 0, &fileSize, inData);
Float32 *outData = malloc(fileSize * sizeof(Float32));
//Art's suggestion, if I've correctly understood him
float ampScale = 0.5f; //this will reduce the 'volume' by -6db
for (int i = 0; i < fileSize; i++) {
outData[i] = (Float32)(inData[i] * ampScale);
}
AudioStreamBasicDescription outDataFormat = {0};
[self audioDataFormat:inFileID];
AudioFileID outFileID;
CFURLRef outURL = [self outSoundURL];
AudioFileCreateWithURL(outURL, kAudioFileWAVEType, &outDataFormat, kAudioFileFlags_EraseFile, &outFileID)
AudioFileWriteBytes(outFileID, false, 0, &fileSize, outData);
AudioFileClose(outFileID);
AudioFileClose(inFileID);
Gracias Art. He actualizado mi código y la pregunta de acuerdo con su sugerencia, pero esto causó otros problemas. Quizás te equivoqué, pero será perfecto si puedes mirar la pregunta actualizada con fragmento de código. – cocoatoucher
He editado mi respuesta con una explicación de por qué su código no funciona y un ejemplo de código que lo hará. –
Arte, estoy agradecido por esta respuesta. No solo me proporcionó el código sino que también me ayudó a comprender lo que está sucediendo. ¡Muchas gracias! Por favor sigue compartiendo Gracias a otras personas también. – cocoatoucher