私はこの種の問題を抱えた最初の人ではありませんが、それを解決することはできませんでした。
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の最後のオーディオパケットの一部をエンコードしておらず、クリックの原因になっている可能性があることに気付きました。ただし、残りのパケットの数を計算する方法がわかりません(わかっている場合は、これらのパケットを、着信する次のバッファーの前に追加される「残りの」バッファーに保存するだけで済みます)。
これが私の設定に関するもう少しの情報です:
私は次のinputFormatを持っています:
- (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);