我不是第一个遇到此类问题的人,但是,我一直无法解决。
我在 iOS 中将 LinearPCM 编码为 MP3。尽管我在每个缓冲区之间都遇到了点击,但它正在工作。
memset(&mEncodedBuffer, 0, sizeof(mEncodedBuffer));
int encodedBytes = lame_encode_buffer(gfp, (short*)inBuffer->mAudioData, NULL, inNumberPacketDescriptions, mEncodedBuffer, MP3_BUFFER_SIZE);
NSData* data = [NSData dataWithBytes:mEncodedBuffer length:encodedBytes];
然后,我对缓冲区执行以下操作:
AudioQueueEnqueueBuffer(vc.recordState.queue, inBuffer, 0, NULL);
在调用 lame_encode_buffer 后,我尝试添加以下行:
encodedBytes += lame_encode_flush(gfp, mEncodedBuffer+encodedBytes, 0);
但是,这也会导致一个光点(我猜它在一帧的末尾输入了一些 0)。尝试这让我意识到我没有对 inBuffer->mAudioData 的一些最后的音频数据包进行编码,这可能会导致点击。但是,我不确定如何计算剩下多少(如果我知道,我可以简单地将这些数据包保存在一个“剩余”缓冲区中,该缓冲区附加到传入的下一个缓冲区)。
以下是有关我的设置的更多信息:
我有以下输入格式:
- (void)setupSourceAudioFormat:(AudioStreamBasicDescription*)format
{
format->mFormatID = kAudioFormatLinearPCM;
format->mSampleRate = 44100;
format->mFramesPerPacket = 1;
format->mChannelsPerFrame = 1;
format->mBytesPerFrame = 2;
format->mBytesPerPacket = 2;
format->mBitsPerChannel = 16;
format->mReserved = 0;
format->mFormatFlags = kLinearPCMFormatFlagIsBigEndian |
kLinearPCMFormatFlagIsSignedInteger |
kLinearPCMFormatFlagIsPacked;
}
我这样设置跛脚:
lame_t gfp = lame_init();
lame_set_num_channels(gfp, 1);
lame_set_in_samplerate(gfp, 44100);
lame_set_mode(gfp, MONO);
lame_set_brate(gfp, 64);
lame_init_params(gfp);