如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue
Posted
技术标签:
【中文标题】如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue【英文标题】:How to feed FFMPEG AV_CODEC_ID_PCM_S16BE audio data to AudioQueue 【发布时间】:2014-10-22 03:02:43 【问题描述】:我正在结合使用 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
尝试了许多不同的参数,但要么音频变得无法识别,要么噪音持续存在。
Here 是带有点击声的音频样本,如果有帮助的话。
【问题讨论】:
【参考方案1】:我不太清楚,但 s16be 是整数(16 位),而 kAudioFormatLinearPCM 是浮点数(32 位)。
如果我处于你的位置,我将只使用 s16be 和 kAudioFormatLinearPCM 格式,这意味着修复 AudioCodecCtx->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16)
和其他格式。
然后在ffmpeg -> ios数据流之间插入PCM格式转换步骤。
这篇文章看起来很有帮助:iOS Core Audio : Converting between kAudioFormatFlagsCanonical and kAudioFormatFlagsAudioUnitCanonical
【讨论】:
【参考方案2】:事实证明,噪音不是解码音频流的问题,而是将音频流馈送到我们的应用程序的摄像头设备的问题。
连接到 android 应用时噪音非常小,导致我们在测试 Android 应用时错过了它,并认为这是我们的 iOS 应用处理音频的问题,而不是设备的问题。
【讨论】:
以上是关于如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue的主要内容,如果未能解决你的问题,请参考以下文章
请问如何将这些 Blender 视频设置转换为 ffmpeg?