不要轻易使用ffmpeg的audio_device_number来设置音频设备
2024-10-06 20:44:25
最近项目中需要使用ffmpeg实现录音功能,使用的ffmpeg-3.4.4的库,根据源代码dshow.c中的定义
{ "audio_device_number", "set audio device number for devices with same name (starts at 0)", OFFSET(audio_device_number), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, DEC },
在PC机存在两个麦克风设备的场合,添加一个[录音设备选择]对话框,可供用户选择。
打个比方:目前的PC机存在两个音频输入设备:
- 0:麦克风 (HD Webcam C270)
- 1:麦克风 (Realtek High Definition Audio)
备注:
- 0号采集设备可以采集音频与视频,不能播放音频;1号采集设备仅可以采集音频,可以播放音频。
- PC机设备播放设备只有1个,那就是:麦克风 (Realtek High Definition Audio),即为0号播放设备。
- 音频采集设备的序号与音频播放设备的序号很可能不一致。
如果指定 0号采集设备:麦克风 (HD Webcam C270)作为音频采集设备,简化代码如下:
char *pchDeviceName = "麦克风 (HD Webcam C270)";
AVInputFormat *m_pAudioInputFormat = av_find_input_format("dshow");
AVDictionary *options = NULL;
av_dict_set(&options, "audio_device_number", "", );
char str_device_gb2312_name[];
_snprintf(str_device_gb2312_name, sizeof(str_device_gb2312_name), "audio=%s", pchDeviceName);
char *pchUtfName = gb2312_to_utf8(str_device_gb2312_name);
int ret = -;
AVFormatContext *m_pAudioFmtCtx = avformat_alloc_context();
ret = avformat_open_input(&m_pAudioFmtCtx, pchUtfName, m_pAudioInputFormat, &options);
这时avformat_open_input函数成功,推测是因为0号音频采集设备与0号音频播放设备都存在所致。
如果指定 1号采集设备:麦克风 (Realtek High Definition Audio)作为音频采集设备,简化代码如下:
char *pchDeviceName = "麦克风 (Realtek High Definition Audio)";
AVInputFormat *m_pAudioInputFormat = av_find_input_format("dshow");
AVDictionary *options = NULL;
av_dict_set(&options, "audio_device_number", "", );
char str_device_gb2312_name[];
_snprintf(str_device_gb2312_name, sizeof(str_device_gb2312_name), "audio=%s", pchDeviceName);
char *pchUtfName = gb2312_to_utf8(str_device_gb2312_name);
int ret = -;
AVFormatContext *m_pAudioFmtCtx = avformat_alloc_context();
ret = avformat_open_input(&m_pAudioFmtCtx, pchUtfName, m_pAudioInputFormat, &options);
这时avformat_open_input函数失败原因是I/O fail,推测是因为1号音频采集设备存在但0号音频播放设备不存在所致。
此时的ffmpeg日志如下:
2019-12-10 13:57:21 076[ERR] Could not find audio only device with name [麦克风 (Realtek High Definition Audio)] among source devices of type audio.
2019-12-10 13:57:21 077[INF] Searching for audio device within video devices for 麦克风 (Realtek High Definition Audio)
2019-12-10 13:57:21 090[ERR] Could not find audio only device with name [麦克风 (Realtek High Definition Audio)] among source devices of type video.
解决方法如下(不指定音频设备序号,仅仅指定音频设备名称):
char *pchDeviceName = "麦克风 (Realtek High Definition Audio)";
AVInputFormat *m_pAudioInputFormat = av_find_input_format("dshow");
AVDictionary *options = NULL;
char str_device_gb2312_name[];
_snprintf(str_device_gb2312_name, sizeof(str_device_gb2312_name), "audio=%s", pchDeviceName);
char *pchUtfName = gb2312_to_utf8(str_device_gb2312_name);
int ret = -;
AVFormatContext *m_pAudioFmtCtx = avformat_alloc_context();
ret = avformat_open_input(&m_pAudioFmtCtx, pchUtfName, m_pAudioInputFormat, &options);
最新文章
- servlet中service() 和doGet() 、doPost() 学习笔记
- C#中快速释放内存,任务管理器可查证
- (转载)XML解析之-XStream解析
- 清除Outlook 2013中缓存的邮件地址
- iOS架构网址
- Asp.Net转换Html加号显示为空格的字符!(自已备用)
- iOS UIKit:CollectionView之设计 (1)
- typedef用法小结
- C#获取数据库连接字符
- java进阶书籍
- Git详解之九:Git内部原理
- PCL安装
- python之流程控制与运算符
- python——简单爬虫
- Pappus一阶矩公式
- 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
- BitMap算法详解
- java 压缩与解压
- 【转】MFC 对话框Border属性设置(None、Thin、Resizing、Dialog Frame)
- HTML&;CSS 学习网站收藏【转】