如何将FFMPEG AV_CODEC_ID_PCM_S16BE音频数据馈送到AudioQueue



我将FFMPEG与FFmpegAudioPlayer结合使用来进行直播。我遇到的问题是,虽然音频可以解码和播放,但当其他应用程序流式传输相同的源时,音频中会出现持续的点击/尖叫噪音。所以我想这个问题是由于在将FFMPEG AV_CODEC_ID_PCM_S16BE音频数据交给AudioQueue:之前如何处理而产生的

audioFormat.mFormatID = kAudioFormatLinearPCM;            
audioFormat.mFormatFlags = kAudioFormatFlagsCanonical;//kAudioFormatFlagIsBigEndian|kAudioFormatFlagIsAlignedHigh;
audioFormat.mSampleRate = pAudioCodecCtx->sample_rate;
audioFormat.mBitsPerChannel = 8*av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
audioFormat.mChannelsPerFrame = pAudioCodecCtx->channels;
audioFormat.mBytesPerFrame = pAudioCodecCtx->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
audioFormat.mBytesPerPacket= pAudioCodecCtx->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
audioFormat.mFramesPerPacket = 1;
audioFormat.mReserved = 0;
pSwrCtx = swr_alloc_set_opts(pSwrCtx,
                                             1,//pAudioCodecCtx->channel_layout,
                                             AV_SAMPLE_FMT_S16,
                                             pAudioCodecCtx->sample_rate,
                                             1,//pAudioCodecCtx->channel_layout,
                                             AV_SAMPLE_FMT_S16,
                                             pAudioCodecCtx->sample_rate,
                                             0,
                                             0);
outCount = swr_convert(pSwrCtx,
                                             (uint8_t **)(&pOut),
                                             in_samples,
                                             (const uint8_t **)pAVFrame1->extended_data,
                                             in_samples);

还请注意,我已经为swr_alloc_set_opts尝试了许多不同的参数,但要么音频变得无法识别,要么噪音持续存在。

如果有帮助的话,这里有一个点击声音的音频样本。

我不太清楚,但s16be是整数(16位),而kAudioFormatLinearPCM是浮点(32位)。

如果我站在你的立场上,我只会使用s16be和kAudioFormatLinearPCM格式,这意味着修复AudioCodecCtx->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)和其他格式
然后在ffmpeg->iOS数据流之间插入PCM格式转换步骤。

这篇文章看起来很有帮助:iOS核心音频:在kAudioFormatFlagsCanonical和kAudioFormFlagsAudioUnitCanonical 之间转换

事实证明,噪音不是解码音频流的问题,而是将音频流提供给我们的应用程序的相机设备的问题。

当连接到安卓应用程序时,噪音是听不见的,这导致我们在测试安卓应用时错过了它,并认为这是我们的iOS应用程序处理音频的问题,而不是设备的问题。

相关内容

  • 没有找到相关文章

最新更新