4

我尝试在 FFmpeg 中捕获 48 kHz 的音频,代码如下:

 AVInputFormat* ifmt = av_find_input_format("dshow");
    CHECK_POINTER_RETURN_VALUE(ifmt, false)

    pFmtCtx = avformat_alloc_context();
    CHECK_POINTER_RETURN_VALUE(pFmtCtx, false)

    AVDictionary *param = nullptr;
    std::string sr = std::to_string(48000);
    av_dict_set(&param, "sample_rate",sr.c_str(), 0);

    int error = avformat_open_input(&pFmtCtx, ffName.c_str(), ifmt, &param);
    if (error != 0) {
        char buf[2014];
        av_strerror(error, buf, 1024);
        LOG(ERROR)<<"open audio device failed,err is "<<buf;
         return false;
    }

但是“avformat_open_input”返回失败,err 显示“I/O 错误”,如果采样率为 44100,则一切正常。

现在 FFmpeg 不支持捕获 48 kHz 音频了吗?

4

2 回答 2

1

这是 FFmpeg 使用的 DirectShow API 的问题。它已通过更改 FFmpeg 得到解决: https ://github.com/FFmpeg/FFmpeg/commit/d9a9b4c877b85fea5a5bad74c3d592a756047f79

具体来说,当音频设备同时支持 44.1 kHz 和 48 kHz 作为时钟倍数时 ,DirectShow 没有充分描述音频设备功能与AUDIO_STREAM_CONFIG_CAPS 。必须改用AM_MEDIA_TYPE中的WAVEFORMATEX 。

于 2021-11-05T23:58:52.220 回答
-1

正如@die maus 所提到的,如果将采样率设置为 44100 而不是 48000,则此方法有效,这可能表明您的输入设备不支持 48 kHz 采样。这不是 FFmpeg 的限制,而是硬件的限制。

正如@moi 所建议的那样,除非您特别需要 48 kHz,否则 44.1 应该可以正常工作。

如果您确实需要 48 kHz(例如,您将音频发送到需要 48 kHz 的其他设备),您可以重新采样音频。为此,FFmpeg 包含libswresample ;请参阅此处的示例。

于 2021-09-11T19:43:56.523 回答