snd音频库在Qt5中的使用

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值