首页 > 解决方案 > 使用 FFmpeg 和 DirectShow(dshow 输入)捕获 48 kHz 音频

问题描述

我尝试在 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 音频了吗?

标签: ffmpegdirectshowffdshow

解决方案


这是 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 。


推荐阅读