优秀的音频EQ均衡器音效源码
不多说,直接上图:这是一款客户定制的播放器,播放器功能很强大,比如变速,变调,BPM节拍响应,淡入淡出,音量管家,EQ均衡器音效调节等等个性化功能:
我们着重推荐下EQ均衡器音效调节功能:
此款EQ均衡器音效调节效果,效果不逊于市面上大部分音效效果,如QQ音乐,酷狗,酷我,百度音乐等。支持各种音效个性化调节,由于客户需求,没有预设更多音效,完全可以实现如QQ均衡器界面功能:
我们的均衡器优势在于,频率段数可以定制,比如10段,15段,20段,30段均可,每段的频点可以设置,可以预设更多效果。
贴点调用代码吧
// EQDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "DanceMusic.h"
#include "EQDlg.h"
#include "DanceMusic.h"
#include "DanceMusicDlg.h"
#include "MusicDlg.h"
// CEQDlg 对话框
IMPLEMENT_DYNAMIC(CEQDlg, CDialog)
CEQDlg::CEQDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEQDlg::IDD, pParent)
{
}
CEQDlg::~CEQDlg()
{
}
void CEQDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SLIDER1, m_eq[0]);
DDX_Control(pDX, IDC_SLIDER2, m_eq[1]);
DDX_Control(pDX, IDC_SLIDER3, m_eq[2]);
DDX_Control(pDX, IDC_SLIDER4, m_eq[3]);
DDX_Control(pDX, IDC_SLIDER5, m_eq[4]);
DDX_Control(pDX, IDC_SLIDER6, m_eq[5]);
DDX_Control(pDX, IDC_SLIDER7, m_eq[6]);
DDX_Control(pDX, IDC_SLIDER8, m_eq[7]);
DDX_Control(pDX, IDC_SLIDER9, m_eq[8]);
DDX_Control(pDX, IDC_SLIDER10, m_eq[9]);
DDX_Control(pDX, IDC_SLIDER11, m_eq[10]);
DDX_Control(pDX, IDC_SLIDER12, m_eq[11]);
DDX_Control(pDX, IDC_SLIDER13, m_eq[12]);
DDX_Control(pDX, IDC_SLIDER14, m_eq[13]);
DDX_Control(pDX, IDC_SLIDER15, m_eq[14]);
DDX_Control(pDX, IDC_SLIDER16, m_eq[15]);
DDX_Control(pDX, IDC_SLIDER17, m_eq[16]);
DDX_Control(pDX, IDC_SLIDER18, m_eq[17]);
DDX_Control(pDX, IDC_ST19, m_eqshow[0]);
DDX_Control(pDX, IDC_ST20, m_eqshow[1]);
DDX_Control(pDX, IDC_ST21, m_eqshow[2]);
DDX_Control(pDX, IDC_ST22, m_eqshow[3]);
DDX_Control(pDX, IDC_ST23, m_eqshow[4]);
DDX_Control(pDX, IDC_ST24, m_eqshow[5]);
DDX_Control(pDX, IDC_ST25, m_eqshow[6]);
DDX_Control(pDX, IDC_ST26, m_eqshow[7]);
DDX_Control(pDX, IDC_ST27, m_eqshow[8]);
DDX_Control(pDX, IDC_ST28, m_eqshow[9]);
DDX_Control(pDX, IDC_ST29, m_eqshow[10]);
DDX_Control(pDX, IDC_ST30, m_eqshow[11]);
DDX_Control(pDX, IDC_ST31, m_eqshow[12]);
DDX_Control(pDX, IDC_ST32, m_eqshow[13]);
DDX_Control(pDX, IDC_ST33, m_eqshow[14]);
DDX_Control(pDX, IDC_ST34, m_eqshow[15]);
DDX_Control(pDX, IDC_ST35, m_eqshow[16]);
DDX_Control(pDX, IDC_ST36, m_eqshow[17]);
DDX_Control(pDX, IDC_CHECK1, m_check);
}
BEGIN_MESSAGE_MAP(CEQDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CEQDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_CHECK1, &CEQDlg::OnBnClickedCheck1)
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_BUTTON2, &CEQDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CEQDlg::OnBnClickedButton3)
END_MESSAGE_MAP()
// CEQDlg 消息处理程序
BOOL CEQDlg::OnInitDialog()
{
CDialog::OnInitDialog();
for(int i=0;i<MACEQ;i++)
{
if(i==3||i==4||i==5||i==6||i==7)
m_eqshow[i].SetFontSize2(10);
}
CString szDefault="40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800";
CString szEQ=theApp.m_main->m_inifile.GetValue("EQSet","Frequency","40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800");
CStringArray tempEQs;
int nTempCount=GetStringsFromSpace(szEQ,tempEQs,",");
if(nTempCount<MACEQ)
szEQ=szDefault;
CString szDefaultDB="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
CString szDB=theApp.m_main->m_inifile.GetValue("EQSet","DBSave","0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0");
CStringArray tempDBs;
int nTempCount2=GetStringsFromSpace(szDB,tempDBs,",");
if(nTempCount2<MACEQ)
szDB=szDefaultDB;
GetStringsFromSpace(szDB,tempDBs,",");
m_pmain->m_player.m_x.EQInitString(szEQ);
m_check.SetCheck(1);
m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
for(int i=0;i<MACEQ;i++)
{
int nDB=atof(tempDBs[i]);
m_eq[i].SetRange(-12,12);
m_eq[i].SetPos(1);
m_eq[i].SetPos(0-nDB);
m_pmain->m_player.m_x.EQSet(i,nDB);
this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(nDB));
}
CStringArray EQs;
int nCount=GetStringsFromSpace(szEQ,EQs,",");
for(int i=0;i<nCount;i++)
{
m_eqshow[i].SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
//this->GetDlgItem(IDC_ST19+i)->SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
}
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CEQDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
for(int i=0;i<MACEQ;i++)
{
if(pScrollBar->GetSafeHwnd()==m_eq[i].GetSafeHwnd())
{
int nPos=0-m_eq[i].GetPos();
TRACE("pos:%d\n",nPos);
m_pmain->m_player.m_x.EQSet(i,nPos);
this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(nPos)/*+"db"*/);
SaveDBs();
break;
}
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CEQDlg::OnCancel()
{
ShowWindow(SW_HIDE);
}
void CEQDlg::OnOK()
{
ShowWindow(SW_HIDE);
}
void CEQDlg::OnBnClickedButton1()
{
for(int i=0;i<MACEQ;i++)
{
m_eq[i].SetPos(0);
m_pmain->m_player.m_x.EQSet(i,0);
this->GetDlgItem(IDC_ST1+i)->SetWindowTextA(ItoA(0));
}
SaveDBs();
}
void CEQDlg::SaveDBs()
{
CString szF;
for(int i=0;i<MACEQ;i++)
{
int nPos=0-m_eq[i].GetPos();
szF+=ItoA(nPos);
if(i!=MACEQ-1)
szF+=",";
}
theApp.m_main->m_inifile.SetValue("EQSet","DBSave",szF);
}
void CEQDlg::OnBnClickedCheck1()
{
m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
}
void CEQDlg::OnBnClickedButton2()//自定义频点
{
m_pmain->m_player.m_x.EQEnable(0);
CEQSetDlg dlg;
if(dlg.DoModal()==IDOK)
{
CStringArray EQs;
int nCount=GetStringsFromSpace(dlg.m_szFs,EQs,",");
for(int i=0;i<nCount;i++)
{
m_eqshow[i].SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
//this->GetDlgItem(IDC_ST19+i)->SetWindowTextA(FormatFrequency(atof(EQs[i]))/*+"Hz"*/);
}
m_pmain->m_player.m_x.EQInitString(dlg.m_szFs);
m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
OnBnClickedButton1();//修改后复位
}
else
m_pmain->m_player.m_x.EQEnable(m_check.GetCheck());
}
void CEQDlg::OnBnClickedButton3()
{
ShowWindow(SW_HIDE);
}
这是调用代码段:
实际上,封装好的EQ设置方法就3个函数:
typedef void(*pEQInitString)(CString szEQ);
typedef void(*pEQEnable)(int nEnableEQ);
typedef void(*pEQSet)(int nIndex,double dbDB);
CString szDefault="40,60,80,100,120,150,200,250,300,400,500,600,1000,1800,3100,5300,9200,15800";
EQInitString(szDefault);
for(int i=0;i<MACEQ;i++)
{
int nDB=atof(tempDBs[i]);
EQSet(i,nDB);
}
调用挺简单的是吧。
如果大家有这方面需求,可以交流合作的,有需要发DEMO的也可以联系我。这个代码可以出售,由于代码是纯C++编写,可以移植应用到各个平台。欢迎骚扰:QQ35744025,谢谢大家!
https://download.csdn.net/download/xjb2006/13459807
应读者强烈要求做了一个简单的DEMO,欢迎大家免费下载品鉴,谢谢大家!
beifangdelang_3389: 感谢作者分享,研究了下,h264_amf 低延迟 对应av_opt_set(c->priv_data, "usage", "ultralowlatency", 0); 还有个问题,ffmpeg h264_amf初始化会先尝试dx11,好像dx11就是会导致缓存一帧,强制使用dx9再改下recvpack流程可以做到不延迟
杭电羊皮卷: 博主您好,我有个问题想要请教一下您,就是我想要在Windows平台下实现硬件加速解码,然后直接在gpu上进行缩放,混屏,叠加水印,然后进行编码,需要什么样的技术可以实现,能否指明方向
周星星的星: 这是编码,不是解码
shengutong9765: qsv 解码设置了av_opt_set(pCodecCtx->priv_data,"async_depth","1",0); 还是比cpu 解码要慢一秒
周星星的星: 作者笔误,正确的英伟达硬件编码字符串为h264_nvenc,而不是h264_cuvid😂😂