我的问题的下一次迭代:
感谢您的输入,它帮助我更多地了解了Frame和inputSamples实用程序。 我已经使用你给我的新知识对我的源代码进行了修改。但我仍然有问题,所以我可能没有完全理解你的意思。 这是我的OpenFile函数,抱歉这个名字,但我稍后会重构;当它工作=)
//-----------------------------------------------------------------------------
/*
This Function Open a File containing the Audio, Binary, Data.
*///___________________________________________________________________________
const short* OpenFile(const char* fileName, long& fileSize, WavFormat* wav)
{
// ouvre le fichier
ifstream file;
file.open((char*)fileName, ios::binary|ios::in);
if (file.good())
{
// Read the WAV's Header
wav = CheckWavHeader(file, wav);
cout << "chunkID: " << wav->chunkID <<'\n';
cout << "chunkSize: " << wav->chunkSize <<'\n';
cout << "format: " << wav->format <<'\n';
cout << "subChunk1ID: " << wav->subChunk1ID <<'\n';
cout << "subChunk1Size: " << wav->subChunk1Size <<'\n';
cout << "audioFormat: " << wav->audioFormat <<'\n'; // audioFormat == 1, alors PCM 16bits
cout << "numChannels: " << wav->numChannels <<'\n';
cout << "sampleRate: " << wav->sampleRate <<'\n';
cout << "byteRate: " << wav->byteRate <<'\n';
cout << "blockAlign: " << wav->blockAlign <<'\n';
cout << "bitsPerSample: " << wav->bitsPerSample <<'\n';
cout << "subChunk2ID: " << wav->subChunk2ID <<'\n';
cout << "subChunk2Size: " << wav->subChunk2Size <<'\n';
// Get the file’s size
file.seekg(0L, ios::end);
fileSize = ((long)file.tellg() - DATA_POS);
file.seekg(DATA_POS, ios::beg); // back to the data.
// Read the Data into the Buffer
uint nbSamples = fileSize / sizeof(short);
short* inputArray = new short[nbSamples];
file.read((char*)inputArray, fileSize);
// Close the file and return the Data
file.close();
return (const short*)inputArray;
}
else
{
exit(-1);
}
}
我正在打开文件,检查它的大小,创建一个短缓冲区并将wav的数据读入短缓冲区,最后我将其返回。
主要是,现在我评论了G711解码器。 当我运行应用程序时,faacEncOpen为inputSamples提供2048(这是逻辑,因为我在Wav的文件中有2个通道,FRAME_LEN为1024)。 所以,如果我理解正确,1帧== 2048个样本用于我的应用程序。因此,对于每个帧,我调用faacEncEncode,我给出了tmpInputBuffer,它是与inputBuffer [i * inputSamples]索引处的inputSamples大小相同的缓冲区。
//-----------------------------------------------------------------------------
/*
The Main entry Point of the Application
*///_____________________________________________________________________________
int main()
{
// Get the File's Data
WavFormat* wav = new WavFormat;
long fileSize;
const short* fileInput = OpenFile("audioTest.wav", fileSize, wav);
// G711 mu-Law Decoder
//MuLawDecoder* decoder = new MuLawDecoder();
//short* inputBuffer = decoder->MuLawDecode_shortArray((byte*)fileInput, (int)nbChunk);
short* inputBuffer = (short*)fileInput;
// Info for FAAC
ulong sampleRate = wav->sampleRate;
uint numChannels = wav->numChannels;
ulong inputSamples;
ulong maxOutputBytes;
// Ouvre l'Encodeur et assigne la Configuration.
faacEncHandle hEncoder = faacEncOpen(sampleRate, numChannels, &inputSamples, &maxOutputBytes);
faacEncConfigurationPtr faacConfig = faacEncGetCurrentConfiguration(hEncoder);
faacConfig->inputFormat = FAAC_INPUT_16BIT;
faacConfig->bitRate = 64000;
int result = faacEncSetConfiguration(hEncoder, faacConfig);
/*Input Buffer and Output Buffer*/
byte* outputBuffer = new byte[maxOutputBytes];
int nbBytesWritten = 0;
Sink* sink = new Sink();
uint nbFrame = fileSize / inputSamples;
int32_t* tmpInputBuffer = new int32_t[inputSamples];
for (uint i = 0; i < nbFrame; i++)
{
strncpy((char*)tmpInputBuffer, (const char*)&inputBuffer[i * inputSamples], inputSamples);
nbBytesWritten = faacEncEncode(hEncoder, tmpInputBuffer, inputSamples, outputBuffer, maxOutputBytes);
cout << 100.0 * (float)i / nbFrame << "%\t nbBytesWritten = " << nbBytesWritten << "\n";
if (nbBytesWritten > 0)
{
sink->AddAACStream(outputBuffer, nbBytesWritten);
}
}
sink->WriteToFile("output.aac");
// Close AAC Encoder
faacEncClose(hEncoder);
// Supprimer tous les pointeurs
delete sink;
//delete decoder;
delete[] fileInput;
//delete[] inputBuffer;
delete[] outputBuffer;
delete[] tmpInputBuffer;
system("pause");
return 0;
}
当输出数据被转储到.acc文件(作为RAW AAC)时,我使用应用程序mp4muxer.exe创建.mp4文件来收听最终转换后的声音。但声音并不好......
我想知道是否有一些我没有看到的东西,或者不是我想要的东西。
提前感谢您提供有用的信息。
答案 0 :(得分:0)
对faacEncEncode
的每次调用都会对inputSamples
个样本进行编码,而不只是一个。你的主循环应该读取WAV文件中的许多样本到输入缓冲区,然后为该缓冲区调用faacEncEncode
一次,最后将输出缓冲区写入AAC文件。
答案 1 :(得分:0)
我可能误解了你在做什么(如果有的话,知道:(1)你正在调用的OpenFile
函数是什么,它是什么(尽管它的名字)实际上读取该文件并打开它?(2)inputBuffer
如何设置?)但是:
faacEncEncode
期望得到一整帧的样本。帧是您在调用inputSamples
时在faacEncOpen
中传回的样本数。 (当然,如果你已经到达输入的末尾,你可以给它少于一整帧。)
因此,对于两帧中的每一帧,你得到460和539字节 - 在每种情况下不是16位。并且看起来你的输入数据指针实际上每次只有一个样本实际偏移,所以你把它交给严重重叠的帧。 (错误的数量; nbChunk
不是你拥有的帧数。)