gpt4 book ai didi

ios - 在 iOS 中使用 LAME 从 PCM 编码为 MP3 时点击

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:12 24 4
gpt4 key购买 nike

我不是第一个遇到此类问题的人,但是,我一直无法解决。

我在 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:

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);

最佳答案

我以前每次对缓冲区进行编码时都会调用 lame_init()。

一旦我将设置代码移出,只有在问题得到解决后才会被调用。

我想发生的事情是 mp3 必须一次至少编码 1152 帧,并且 lame_t 编码器会跟踪上次调用时未编码的数据。所以 lame_encode_buffer 可以从我们停止的地方开始。

lame_encode_flush 应该只用在文件的最后(否则最后几帧会被切掉,除非帧数是 1152 的倍数——不太可能)。

关于ios - 在 iOS 中使用 LAME 从 PCM 编码为 MP3 时点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13277042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com