snd音频库在Qt5中的使用

来源:互联网 发布:游客人流量软件 编辑:程序博客网 时间:2024/05/17 00:57

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();}