我将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应用程序处理音频的问题,而不是设备的问题。