Snd音频库在Qt5中的使用
在工程文件夹(.pro文件同级)下创建3rdParty文件夹,将libsndfile全部拷贝到此文件夹,如图所示
在.pro文件中加入如下代码:
INCLUDEPATH+=$$PWD/3rdParty/libsndfile/include
LIBS += -L$$PWD/3rdParty/libsndfile/lib-llibsndfile-1
其中$$PWD=当前工作目录
加入引用
#include "sndfile.h"
加入宏定义
#define SAMPLE_RATE 44100
#define SAMPLE_COUNT (SAMPLE_RATE *4) /* 4 seconds */
#define AMPLITUDE (1.0 *0x7FFFFFFF)
#define LEFT_FREQ (344.0 /SAMPLE_RATE)
#define RIGHT_FREQ (2 * 344.0 /SAMPLE_RATE)
创建音频文件的函数
void MainWindow::creatWav()
{
SNDFILE *file ;
SF_INFO sfinfo ;
int k ;
int *buffer ;
if (! (buffer = (int*)malloc (2 * SAMPLE_COUNT * sizeof (int))))
{
printf ("Mallocfailed.\n") ;
exit (0) ;
} ;
memset (&sfinfo, 0, sizeof (sfinfo)) ;
sfinfo.samplerate = SAMPLE_RATE;
sfinfo.frames = SAMPLE_COUNT;
sfinfo.channels = 2 ;
sfinfo.format =(SF_FORMAT_WAV | SF_FORMAT_PCM_16) ;
if (! (file = sf_open ("sine.wav", SFM_WRITE, &sfinfo)))
{
printf ("Error : Not ableto open output file.\n") ;
} ;
for (k = 0 ; k < SAMPLE_COUNT ; k++)
{
buffer [2 * k] = AMPLITUDE *sin (LEFT_FREQ * 2 * k * M_PI) ;
buffer [2 * k + 1] = AMPLITUDE * cos (RIGHT_FREQ * 2 * k * M_PI) ;
} ;
if (sf_write_int (file, buffer, sfinfo.channels * SAMPLE_COUNT) !=sfinfo.channels * SAMPLE_COUNT) puts (sf_strerror (file)) ;
sf_close (file) ;
}
读取音频文件并写入txt的函数
void MainWindow::readTest()
{
ui->setupUi(this);
SF_INFO sf_info;
SNDFILE *snd_file;
double *buf1;
sf_info.format = 0;
snd_file = sf_open("sine.wav", SFM_READ, &sf_info) ;
WriteLog(sf_version_string());
WriteLog("samplerate:"+QString::number(sf_info.samplerate));
WriteLog("open success");
buf1 = (double *)malloc(sf_info.channels*sf_info.frames*sizeof(double));
WriteLog("malloc success");
sf_readf_double(snd_file, buf1, sf_info.frames) ;
WriteLog("read success");
QFile file1("left.txt");
QFile file2("right.txt");
file1.open(QIODevice::WriteOnly | QIODevice::Append);
file2.open(QIODevice::WriteOnly | QIODevice::Append);
WriteLog("file open success");
QTextStream text_stream1(&file1);
QTextStream text_stream2(&file2);
for(int i=0;i
写日志文件的函数
void MainWindow::WriteLog(QString message)
{
QFile file("log.txt");
//文件大于10M执行删除
if(file.size()>= 10000000)file.remove();
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&file);
text_stream << message << "\r\n";
file.flush();
file.close();
}