[英]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(¶m, "sample_rate",sr.c_str(), 0);
int error = avformat_open_input(&pFmtCtx, ffName.c_str(), ifmt, ¶m);
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.