Reducir el tamaño del archivo de audio convertido

Estoy convirtiendo mi audio grabado que está en formato .m4a a formato .caf. La configuración del audio grabado es la siguiente:

/* Record settings for recording the audio*/ 
recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
                 [NSNumber numberWithInt:44100.0],AVSampleRateKey,
                 [NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
                 [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
                 [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
                 [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                 nil];

Convierto el audio a .caf usando esta función:

-(NSString *)handleConvertToPCM:(NSURL *)convertUrl 
{
    [self performSelectorOnMainThread:@selector(showActivity) withObject:nil waitUntilDone:NO];

    DEBUG_LOG(@"DEBUGGING");
    DEBUG_LOG(@"handleConvertToPCM");
    // open an ExtAudioFile
    NSLog (@"opening %@", convertUrl);
    ExtAudioFileRef inputFile;
    CheckResult (ExtAudioFileOpenURL((CFURLRef)convertUrl, &inputFile),
                 "ExtAudioFileOpenURL failed");
    // prepare to convert to a plain ol' PCM format
    AudioStreamBasicDescription requiredPCMFormat;
    requiredPCMFormat.mSampleRate = 44100; // todo: or use source rate?
    requiredPCMFormat.mFormatID = kAudioFormatLinearPCM ;
    requiredPCMFormat.mFormatFlags =  kAudioFormatFlagsCanonical;   
    requiredPCMFormat.mChannelsPerFrame = 2;
    requiredPCMFormat.mFramesPerPacket = 1;
    requiredPCMFormat.mBitsPerChannel = 16;
    requiredPCMFormat.mBytesPerPacket = 4;
    requiredPCMFormat.mBytesPerFrame = 4;
    CheckResult (ExtAudioFileSetProperty(inputFile, kExtAudioFileProperty_ClientDataFormat,
                                         sizeof (requiredPCMFormat), &requiredPCMFormat),
                 "ExtAudioFileSetProperty failed");
    // allocate a big buffer. size can be arbitrary for ExtAudioFile.
    UInt32 outputBufferSize = 0x10000;
    void* ioBuf = malloc (outputBufferSize);
    UInt32 sizePerPacket = requiredPCMFormat.mBytesPerPacket;   
    UInt32 packetsPerBuffer = outputBufferSize / sizePerPacket;
    // set up output file   
    self.outputPath = [NSString stringWithFormat:@"%@/export-pcm.caf",DOCUMENTS_FOLDER];
    self.outputURL = [NSURL fileURLWithPath:self.outputPath];
    DEBUG_LOG(@"creating output file %@", self.outputURL);
    AudioFileID outputFile;
    CheckResult(AudioFileCreateWithURL((CFURLRef)outputURL,
                                       kAudioFileCAFType,
                                       &requiredPCMFormat, 
                                       kAudioFileFlags_EraseFile, 
                                       &outputFile),
                "AudioFileCreateWithURL failed");
    // start convertin'
    UInt32 outputFilePacketPosition = 0; //in bytes
    while (true) 
    {
        // wrap the destination buffer in an AudioBufferList
        AudioBufferList convertedData;
        convertedData.mNumberBuffers = 1;
        convertedData.mBuffers[0].mNumberChannels = requiredPCMFormat.mChannelsPerFrame;
        convertedData.mBuffers[0].mDataByteSize = outputBufferSize;
        convertedData.mBuffers[0].mData = ioBuf;
        UInt32 frameCount = packetsPerBuffer;
        // read from the extaudiofile
        CheckResult (ExtAudioFileRead(inputFile,
                                      &frameCount,
                                      &convertedData),
                     "Couldn't read from input file");
        if (frameCount == 0) 
        {
            printf ("done reading from file");
            break;
        }
        // write the converted data to the output file
        CheckResult (AudioFileWritePackets(outputFile,
                                           false,
                                           frameCount,
                                           NULL,
                                           outputFilePacketPosition / requiredPCMFormat.mBytesPerPacket, 
                                           &frameCount,
                                           convertedData.mBuffers[0].mData),
                     "Couldn't write packets to file");

        DEBUG_LOG(@"Converted %ld bytes", outputFilePacketPosition);
        // advance the output file write location
        outputFilePacketPosition += (frameCount * requiredPCMFormat.mBytesPerPacket);
    }
    // clean up
    ExtAudioFileDispose(inputFile);
    AudioFileClose(outputFile);
    return(self.outputPath);    

}

Mi problema es que el tamaño del archivo convertido es muy alto en comparación con el archivo dado para la conversión. ¿Hay alguna forma de disminuir el tamaño cambiando la configuración de conversión? Intenté comprimir el archivo obtenido, pero lleva mucho tiempo comprimir, así que me gustaría encontrar una forma de reducir el tamaño junto con la conversión.

preguntado el 08 de noviembre de 11 a las 12:11

Está decodificando un archivo MP4 en PCM simple. Eso ciertamente resulta en un gran aumento de tamaño. ¿Por qué está convirtiendo el archivo en primer lugar? -

Es necesario así. Alguna forma de disminuir el tamaño. ¿Funcionará algún cambio en la configuración? Intenté algunos pero fallé. -

No estoy familiarizado con la escritura de música en iOs, pero cuando convertí sonidos con una herramienta para mi juego, al pasar de estéreo a mono se redujo el tamaño a la mitad. ¿Quizás mono es suficiente para ti? -

Puede terminar con archivos más pequeños: reduciendo los dos canales (también conocido como estéreo) a un canal, reduciendo la tasa de bits del codificador (por ejemplo, 32 kbps), reduciendo la velocidad de reproducción (por ejemplo, 22 kHz). En cualquier caso, no use PCM sino que siga con la codificación AAC (archivos MP4). -

No funciona si cambio alguna de las configuraciones. La aplicación se bloqueará y el error dice Error: ExtAudioFileSetProperty failed ('fmt?') Que ocurre durante CheckResult (ExtAudioFileSetProperty ()). -

1 Respuestas

La descompresión de un archivo de audio muy comprimido casi siempre da como resultado un archivo de resultado mucho más grande, a menos que lo vuelva a comprimir utilizando un formato de compresión aún con menos pérdidas.

respondido 08 nov., 11:20

¿Hay alguna forma de recomprimir el audio que requiera menos tiempo? - Siddharth

Para el formato caf, el tamaño del archivo será proporcional a la frecuencia de muestreo (comúnmente 44.1 kHz) multiplicado por los bits por muestra (normalmente 16 bits o 2 bytes) multiplicado por el número de canales (1, 2 o 5) multiplicado por la longitud del audio. en segundos. ¿Cuál quieres reducir? - hotpaw2

El tamaño de mi audio de 2 minutos después de la conversión es de casi 20 MB. Me gustaría reducirlo a un tamaño máximo de 5 MB. ¿Qué configuración debo usar para lograr esto? - Siddharth

Reduzca a la mitad 2 de las 4 cosas. Cualquiera 2. - hotpaw2

No funciona si cambio alguna de las configuraciones. La aplicación se bloqueará y el error dice Error: ExtAudioFileSetProperty failed ('fmt?') Que ocurre durante CheckResult (ExtAudioFileSetProperty ()). - Siddharth

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.