版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
酷狗音乐是当今界面做的最好的软件,本人一直想模仿它,经过多年的研究,终于通过QT+FFmpg+OpenCV来解决了全部功能。
QT用来设计界面
FFmpeg用来解码音频和频谱
OpenCV用来对频谱图像优化
在这些功能中,频谱是比较难实现的,我的方案是选通过FFmpeg获取音频采样率,再分析绘制成QImage图像,再用OpenCV优化。
下图是绘制的原图:
图像经过高斯模糊后的效果,发现边缘变黑了.不美观,关键在下一步!
经过本人对PS的了解,用了一个巧妙的方法:反相,黑边缘变成白的,好看多了!和酷狗也差不了多少了!
反相的代码如下(QT):
invert(Mat& mat)
{
int alphaWidth=mat.cols/10;//计算淡入淡出的宽度,图像的1/10.
int w= mat.rows;
int h= mat.cols;
for (int i = 0; i < w; ++i) {
for (int j = 0; j < h; ++j) {
Vec4b& rgba = mat.at<Vec4b>(i, j);
if(rgba[3]>0)
{
//下面是对RGB进行反相,255-rgb值的绝对值
rgba[0]=qAbs(255-rgba[0]);//r
rgba[1]=qAbs(255-rgba[1]);//g
rgba[2]=qAbs(255-rgba[2]);//b
//下面是图像左边淡入处理rgba[3]为图像的Alph值,即透明度。
if(j<alphaWidth)
{
rgba[3]=rgba[3]*((double)j/(double)alphaWidth);
}
//下面是图像右边淡出处理
else if(j>h-alphaWidth)
{
rgba[3]=rgba[3]*((double)(h-j)/(double)alphaWidth);
}
}
}
}
}
主程序的一些代码:
Mat src_img = QImageToMat(m_img);//QImage转Mat
Mat des_img;
GaussianBlur(src_img,des_img,Size(0,0),4);//调用OpenCV的高峰期模糊函数
des_qimg=MatToQImage(invert(des_img));//反相后转为QImage格式
update();//更新背景频谱
下面是播放器的一些图片:
软件效果观看视频:https://www.bilibili.com/video/av62887688/
由于程序有一些功能还在完善中,不久后将公布相关教程和源码!大家期待,也可一起探讨研究!