【问题标题】:Clicks while using LAME to encode from PCM to MP3 in iOS在 iOS 中使用 LAME 从 PCM 编码到 MP3 时的点击次数
【发布时间】:2012-10-27 22:35:22
【问题描述】:

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

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

【问题讨论】:

    标签: ios audio mp3 pcm lame


    【解决方案1】:

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

    一旦我将该设置代码移出以便仅在问题解决后调用。

    我猜发生的情况是 mp3 必须一次编码至少 1152 帧,而 lame_t 编码器会跟踪上次调用时未编码的数据。所以 lame_encode_buffer 可以从我们中断的地方开始。

    lame_encode_flush 只能用在文件的最后(否则最后几帧会被截断,除非帧数是 1152 的精确倍数——不太可能)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2023-03-27
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多