我正在尝试在 Qt Windows+macOs 应用程序中使用 ffmpeg 读取外部立体声麦克风,但我正在努力在 macOs 上获得一致的正确输入编解码器参数。到目前为止我的发现和怀疑:
我在 macOS 中使用的代码如下,其中所有内容都返回成功的返回代码:
avdevice_register_all();
//macOs only, the same code in windows looks for "dshow"
const AVInputFormat *inputFormat = av_find_input_format("avfoundation");
AVFormatContext* inputFormatContext;
avformat_open_input(&inputFormatContext, inputDevice, inputFormat, NULL);
avformat_find_stream_info(inputFormatContext, NULL);
//... allocate the codec context for the single input stream and
// copy the parameters from the stream to the context
在我的独立最小再现器中,在 macOS 和 Windows 中,这始终会导致单个流的编解码器 ID 为 AV_CODEC_ID_PCM_F32LE。当我将此代码集成到 Windows 上的 Qt 应用程序中时,我得到了相同的结果。但是,在 macOS 上,大多数情况下,流的编解码器 ID 为 AV_CODEC_ID_PCM_S16LE(通过 AV_CODEC_ID_FIRST_AUDIO),有时为 AV_CODEC_ID_PCM_F32LE。我的麦克风支持这两种示例格式。
AV_CODEC_ID_PCM_F32LE 始终会产生正确的输出。 AV_CODEC_ID_PCM_S16LE 导致嗡嗡声噪音音频减慢至 0.5 倍,如果在这种情况下我使用 AV_CODEC_ID_PCM_F32LE 进行解码而不是从流中复制编解码器参数,则输出声音再次正确。
我正在尝试编写通用代码,因此在强制执行 AV_CODEC_ID_PCM_F32LE 编解码器工作时,我宁愿了解发生了什么。
我错过了什么? Qt 是否以某种我无法想到的方式进行交互?我正在编译和链接我自己的 ffmpeg 库(6.1.1),而不是使用 Qt 的库。
发生的事情是音频工具箱库在调用
avformat_open_input
时引发错误:CMIO_Unit_Converter_Audio.cpp:590:RebuildAudioConverter AudioConverterSetProperty(dbca) failed (1886547824)
这导致流的编解码器 ID 设置为虚拟的
AV_CODEC_ID_FIRST_AUDIO
而不是正确的。