簡體   English   中英

使用 FFmpeg 和 DirectShow(dshow 輸入)捕獲 48 kHz 音頻

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

我嘗試在 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 音頻?

這是 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

正如@die maus 所提到的,如果采樣率設置為 44100 而不是 48000,這可能表明您的輸入設備不支持以 48 kHz 采樣。 這不是 FFmpeg 的限制,而是硬件的限制。

正如@moi 建議的那樣,除非您對 48 kHz 有特定需求,否則 44.1 應該可以正常工作。

如果您確實需要 48 kHz(例如,您將音頻發送到其他需要 48 kHz 的頻率),您可以重新采樣音頻。 為此,FFmpeg 包含libswresample 請參閱此處的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM