如何养活FFMPEG AV_CODEC_ID_PCM_S16BE音频数据AudioQueue
我结合使用FFMPEG与FFmpegAudioPlayer做现场直播。我遇到的问题是,虽然音频可以被解码和播放,但音频中存在不断出现的点击/尖锐噪声,当其他应用程序流式传输相同的源时,该噪声不存在。所以我想这个问题的出现是由于我如何处理FFmpeg的AV_CODEC_ID_PCM_S16BE
音频数据递给AudioQueue前:如何养活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
,但无论哪种声音变得面目全非或者噪音依然存在。
Here的与咔哒声,如果它可以帮助音频的样本。
原来,噪音是不是在音频流解码的问题,但在摄像装置的饲料音频流应用程序的一个问题。
当连接到Android应用程序时,噪声是无法听到的,在测试Android应用程序时导致我们错过它,并认为这是iOS应用程序处理音频的问题,而不是设备出现问题。
我不知道到底,但s16be是整数(16位),而kAudioFormatLinearPCM为float(32位)。
如果我在你的鞋子,我只会使用s16be和kAudioFormatLinearPCM格式,这意味着修复AudioCodecCtx->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)
和其他人。
然后插入的ffmpeg之间PCM格式转换步骤 - >的iOS数据流。
这个职位看起来非常有帮助的:iOS Core Audio : Converting between kAudioFormatFlagsCanonical and kAudioFormatFlagsAudioUnitCanonical