FFMPEG - 努力在 macOS 上找到正确的输入音频编解码器参数

问题描述 投票:0回答:1

我正在尝试在 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 的库。

c macos ffmpeg qtmultimedia
1个回答
0
投票

发生的事情是音频工具箱库在调用

avformat_open_input
时引发错误:
CMIO_Unit_Converter_Audio.cpp:590:RebuildAudioConverter AudioConverterSetProperty(dbca) failed (1886547824)

这导致流的编解码器 ID 设置为虚拟的

AV_CODEC_ID_FIRST_AUDIO
而不是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.