Comment utilisez-vous actuellement SoundTouch? Transmettez-vous des échantillons audio à la bibliothèque SoundTouch lorsque vous les lisez? Ou est-ce que vous lancez l'utilitaire soundstretch et transmettez l'audio sous forme de fichier ou de pipe?
Je ne suis pas familier avec SoundTouch, mais on dirait qu'il veut l'audio PCM comme entrée, donc vous êtes probablement déjà en train de convertir en PCM. Si vous voulez passer des échantillons audio à SoundTouch que vous les recevez, vous pouvez décoder avec FAAC en utilisant quelque chose comme ça
#include <stdio.h>
#include <inttypes.h>
#include <faac.h>
#include <neaacdec.h>
#define SAMPLE_SIZE 2 //2 bytes, or 16bits per samle.
int AACDecode(uint8_t *aacData, size_t aacBytes, uint32_t sampleRate, unsigned char channels)
{
NeAACDecHandle decoder = NeAACDecOpen();
NeAACDecConfigurationPtr config = NeAACDecGetCurrentConfiguration(decoder);
NeAACDecFrameInfo info;
uint8_t *decoded = NULL;
uint8_t *readPtr = aacData;
int consumed = 0;
//If the AAC data is wrapped in ADTS, you don't need the next 2 lines
//If it's not wrapped in ADTS, you need to know sampleRate, and object type
//Object type is one of LOW, MAIN, SSR, LTP
config->defObjectType = LOW;
config->defSampleRate = sampleRate;
//If SoundTouch wants it in something other than siged 16bit LE PCM, change this
config->outputFormat = FAAD_FMT_16BIT;
if (!NeAACDecSetConfiguration(decoder, config))
{
printf("unable to set config\n");
return 0;
}
if (NeAACDecInit(decoder, (unsigned char *)aacData, aacBytes, &sampleRate, &channels) < 0)
{
printf("unable to init\n");
return 0;
}
do
{
decoded = (char *)NeAACDecDecode(decoder, &info, readPtr, aacBytes);
if (info.samples > 0)
{
size_t decodedBytes = (size_t)info.samples * SAMPLE_SIZE;
//Pass <decodedBytes> of PCM data, pointed to by <decoded> to soundTouch
}
consumed += info.bytesconsumed;
readPtr += info.bytesconsumed;
} while (info.error == 0 && consumed < aacBytes);
NeAACDecClose(decoder);
return 1;
}
Vous auriez besoin de se lier à la bibliothèque FAAD
Ou si vous êtes allant de la route de ligne de commande, peut-être quelque chose comme ceci:
ffmpeg -i <input_file> raw.wav
raw.wav pourrait alors être transmis à soundstretch
J'ai essayé votre code, mais il échoue à NeAACDecDecode (info.error n'est pas z ero), bien que l'utilitaire de ligne de commande faad décode correctement mon fichier. Des pensées? – lynnard