ffmpeg - 使用 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(¶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 。
推荐阅读
- scala - 如何在 Spark Scala 中的 Schema RDD [从案例类中创建] 中查找重复项以及相应的重复计数?
- yaml - 验证空条目的架构
- c++ - 类的容器,保留 cv 限定符和引用?
- typescript - 带有 TypeScript 错误状态类型的 Express
- docker - Webscraper(python)Docker写访问被拒绝
- vue.js - Nuxt 发出未定义的数据
- bsod - 如何解决反复出现的bsod错误?
- python - 获取西班牙语(和其他非英语语言)中单个单词的所有可能引理
- javascript - 在 webpack 库中加载 Web Worker
- javascript - 是否可以使用纬度和对数坐标在自定义地球上设置地图标记?