使用 FFmpeg 和 DirectShow(dshow 输入)捕获 48 kHz 音频

Capturing 48 kHz audio with FFmpeg and DirectShow (dshow input)

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

 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”return失败,err显示“I/O错误”,如果采样率为44100,一切正常。

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

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

正如@moi 所建议的,除非您有特定的 48 kHz 需求,否则 44.1 应该可以正常工作。

如果您确实需要 48 kHz(例如,您将音频发送到需要 48 kHz 的其他设备),您可以对音频重新采样。 FFmpeg 包括 libswresample for this purpose; see the example here.

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

具体来说,DirectShow 没有充分描述音频设备的功能,因此必须使用 AUDIO_STREAM_CONFIG_CAPS when the audio device supports both 44.1 kHz and 48 kHz as clock multiples. WAVEFORMATEX within the AM_MEDIA_TYPE