Réduire l'amplitude de la sortie d'ExtAudioFileRead
-
21-12-2019 - |
Question
Je cherche à réduire l'amplitude de la sortie d'ExtAudioFileRead avant de la réenregistrer dans un fichier.Voici mon code d'origine :
AudioBufferList convertedData;
convertedData.mNumberBuffers=1;
convertedData.mBuffers[0].mNumberChannels=mySettings->outputFormat.mChannelsPerFrame;
convertedData.mBuffers[0].mDataByteSize=outputBufferSize;
convertedData.mBuffers[0].mData=outputBuffer;
frameCount=packetsPerBuffer;
CheckError(ExtAudioFileRead(mySettings->inputFile,
&frameCount,
&convertedData)
J'avais pensé à boucler via convertedData.mbuffers [0] .mdata, multipliant chaque échantillon par une fraction, mais c'est de type "vide". Toutes les idées seraient formidables, merci d'avoir lu!
MODIFIER:
Voici le chemin que je suis en train de suivre maintenant :
UInt8 *littleBuffer=(UInt8*)malloc(sizeof(UInt8)*outputBufferSize);
Float32 *signalData=(Float32*)convertedData.mBuffers[0].mData;
for (int i=0;i<outputBufferSize;i++){
Float32 frameData=signalData[i];
littleBuffer[i]=0.5*(UInt8)frameData;
}
Le fichier de sortie n'est certainement pas une version mise à l'échelle de l'entrée, mais je pense que cela peut être dû à des choix de variables incorrects ci-dessus.
La solution
J'ai compris.En remplaçant littleBuffer[i]=0.5*(UInt8)frameData;
avec le code ci-dessous, l'audio évolue comme prévu.
float frameData=signalData[i];
if (frameData>127){
frameData=255-frameData;
frameData*=scaleFactor;
frameData=255-frameData;
}else{
frameData*=scaleFactor;
}
littleBuffer[i]=(int)frameData;
Certes, il y a du bruit après la mise à l'échelle. Ma meilleure hypothèse est qu'il s'agit d'un bruit de quantification lié au faible débit binaire.