如何将 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的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg:如何将 wav 作为音频输入来创建视频?

请问如何将这些 Blender 视频设置转换为 ffmpeg?

ffmpeg:如何将音频波文件循环到没有任何音频通道的视频中

如何使用 ffmpeg 将字幕嵌入到 .mp4 电影

如何使用`ffmpeg`将视频转换为`m4v`?

如何使用 FFmpeg 将灰度视频流编码为 MPEG-1?