1、获取系统音设备名称
windows下获取系统需要安装软件:Setup Screen Capturer Recorder
安装之后使用ffmpeg命令查看设备可以发现
ffmpeg -list_devices true -f dshow -i dummy

注意我们在写代码获取音频设备的时候,我暂时的方法找不到该设备名,因此暂时是写死的。
2、获取音频
2.1、初始化音频设备
bool CCameraRecord::InitAudioSysInput()
{
dzlog_info("%s(%d) Start", __FUNCTION__, __LINE__);
string strAudioDeviceName = "virtual-audio-capturer";
if (strAudioDeviceName == "")
{
dzlog_info("%s(%d) m_strAudioDeviceName Fail", __FUNCTION__, __LINE__);
return false;
}
//m_bAudioInit = false;
AVDictionary *device_param = 0;
char szDeviceName[1024] = {
0 };
sprintf_s(szDeviceName, 5096, "audio=%s", strAudioDeviceName.c_str());
string device_name_utf8 = AnsiToUTF8(szDeviceName, strlen(szDeviceName));
dzlog_info("%s(%d) m_strAudioDeviceName=%s", __FUNCTION__, __LINE__, strAudioDeviceName.c_str());
dzlog_info("%s(%d) szDeviceName=%s", __FUNCTION__, __LINE__, szDeviceName);
dzlog_info("%s(%d) device_name_utf8=%s", __FUNCTION__, __LINE__, device_name_utf8.c_str());
if (avformat_open_input(&m_pAudSysFmtCtx, device_name_utf8.c_str(), m_pInputFormat, &device_param) != 0)
{
dzlog_info("%s(%d) avformat_open_input Fail", __FUNCTION__, __LINE__);
return false;
}
if (avformat_find_stream_info(m_pAudSysFmtCtx, NULL) < 0)
{
dzlog_info("%s(%d) avformat_find_stream_info Fail", __FUNCTION__, __LINE__);
return false;
}
int m_audioindex = -1;
for (int i = 0; i < m_pAudSysFmtCtx->nb_streams; i++)
{
if (m_pAudSysFmtCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
{
m_audioindex = i;
break;
}
}
if (m_audioindex == -1)
{
dzlog_info("%s(%d) m_audioindex == -1", __FUNCTION__, __LINE__);
return false;
}
if (avcodec_open2(m_pAudSysFmtCtx->streams[m_audioindex]->codec, avcodec_find_decoder(m_pAudSysFmtCtx->streams[m_audioindex]->codec->codec_id), NULL) < 0)
{
dzlog_info("%s(%d) avcodec_open2 Fail", __FUNCTION__, __LINE__);
return false;
}
m_nSample_rateSys = m_pAudSysFmtCtx->

本文介绍了如何在Windows下通过SetupScreenCapturerRecorder安装软件,使用ffmpeg列出音频设备并初始化音频输入。详细讲解了如何初始化混音filter,实现音频帧的解码和混音,以及如何在混音过程中控制静音。

1378

被折叠的 条评论
为什么被折叠?



