Necesito convertir un archivo WAVE en un archivo AAC codificado M4A en iOS. Soy consciente de que la codificación AAC no es compatible con dispositivos más antiguos o en el simulador. Lo estoy probando antes de ejecutar el código. Pero todavía no puedo hacer que funcione.¿Cómo puedo hacer que funcione la codificación AAC con ExtAudioFile en iOS?
Miré en el propio ejemplo de iPhoneExtAudioFileConvertTest de Apple y pensé que lo seguí exactamente, ¡pero todavía no tuve suerte!
Actualmente, obtengo un -50 (= error en la lista de parámetros de usuario) al intentar establecer el formato del cliente en el archivo de destino. En el archivo fuente, funciona.
A continuación se muestra mi código. Cualquier ayuda es muy apreciada, ¡gracias!
UInt32 size;
// Open a source audio file.
ExtAudioFileRef sourceAudioFile;
ExtAudioFileOpenURL((CFURLRef)sourceURL, &sourceAudioFile);
// Get the source data format
AudioStreamBasicDescription sourceFormat;
size = sizeof(sourceFormat);
result = ExtAudioFileGetProperty(sourceAudioFile, kExtAudioFileProperty_FileDataFormat, &size, &sourceFormat);
// Define the output format (AAC).
AudioStreamBasicDescription outputFormat;
outputFormat.mFormatID = kAudioFormatMPEG4AAC;
outputFormat.mSampleRate = 44100;
outputFormat.mChannelsPerFrame = 2;
// Use AudioFormat API to fill out the rest of the description.
size = sizeof(outputFormat);
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &outputFormat);
// Make a destination audio file with this output format.
ExtAudioFileRef destAudioFile;
ExtAudioFileCreateWithURL((CFURLRef)destURL, kAudioFileM4AType, &outputFormat, NULL, kAudioFileFlags_EraseFile, &destAudioFile);
// Create canonical PCM client format.
AudioStreamBasicDescription clientFormat;
clientFormat.mSampleRate = sourceFormat.mSampleRate;
clientFormat.mFormatID = kAudioFormatLinearPCM;
clientFormat.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
clientFormat.mChannelsPerFrame = 2;
clientFormat.mBitsPerChannel = 16;
clientFormat.mBytesPerFrame = 4;
clientFormat.mBytesPerPacket = 4;
clientFormat.mFramesPerPacket = 1;
// Set the client format in source and destination file.
size = sizeof(clientFormat);
ExtAudioFileSetProperty(sourceAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
size = sizeof(clientFormat);
ExtAudioFileSetProperty(destAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat);
// Make a buffer
int bufferSizeInFrames = 8000;
int bufferSize = (bufferSizeInFrames * sourceFormat.mBytesPerFrame);
UInt8 * buffer = (UInt8 *)malloc(bufferSize);
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = clientFormat.mChannelsPerFrame;
bufferList.mBuffers[0].mData = buffer;
bufferList.mBuffers[0].mDataByteSize = (bufferSize);
while(TRUE)
{
// Try to fill the buffer to capacity.
UInt32 framesRead = bufferSizeInFrames;
ExtAudioFileRead(sourceAudioFile, &framesRead, &bufferList);
// 0 frames read means EOF.
if(framesRead == 0)
break;
// Write.
ExtAudioFileWrite(destAudioFile, framesRead, &bufferList);
}
free(buffer);
// Close the files.
ExtAudioFileDispose(sourceAudioFile);
ExtAudioFileDispose(destAudioFile);
¿Alguna vez funciona esto? Estoy buscando convertir un .wav a .acc también. – RyanG
Hola Ryan, revisa mi propia respuesta a esto a continuación. – Sebastian