分割故障和wav文件阅读器
Segmentation fault and wav file reader
我决定用c++来玩音频算法,更习惯于Matlab我有点挣扎。
第一步是使用sndfile库将wav文件记录到数组中。我使用了库中的示例:
https://github.com/michaelwu/libsndfile/blob/master/examples/sfprocess.c我想创建一个包含wav的一般信息的wavF类(采样频率,通道…)并将wav文件的数据进行进一步处理。
我几乎已经实现了这一点,但是在wavfile.cpp中进入while ((readcount = sf_read_double (infile, data, BUFFER_LEN)))
循环(但并不总是)时发生分段错误。我不明白为什么。
我想将wav数据保存在数组double* m_wavData中,使用函数process_data在类构造函数中使用缓冲区循环。
代码如下:
主目录:
#include <sndfile.h>
#include <stdio.h>
#include "wavfile.h"
int main (void)
{
SNDFILE *infile ;
const char *infilename = "Piano_mf_Gb2.wav" ;
SndfileHandle file;
file=SndfileHandle(infilename);
int test(initwav(infile, file, infilename));
if(test==1) return 0 ;
wavF wav1(infile, file, infilename);
sf_close (infile) ;
/* Close input and output files. */
return 0 ;
} /* main */
标题:
#ifndef WAVFILE_H_INCLUDED
#define WAVFILE_H_INCLUDED
#define BUFFER_LEN 1024
#include <sndfile.hh>
class wavF
{
public:
wavF(SNDFILE *infile, SndfileHandle file,const char * fName);
wavF(const unsigned int wavsize,const unsigned int channels,const unsigned int samplerate,const char * fileName);
~wavF();
protected:
const unsigned int m_wavsize;
const unsigned int m_channels;
const unsigned int m_samplerate;
const char * m_fileName;
double * m_wavData;
};
static void process_data (double *wavData, double * data, int count, int channels);
int initwav(SNDFILE *infile,SndfileHandle file,const char * fName);
#endif // WAVFILE_H_INCLUDED
和代码wavfile.cpp
#include "wavfile.h"
wavF::wavF(SNDFILE *infile, SndfileHandle file,const char * fName): m_channels(file.channels()),m_samplerate(file.samplerate()),m_wavsize(file.frames()),m_fileName(fName)
{
/* This is a buffer of double precision floating point values
** which will hold our data while we process it.
*/
static double data [BUFFER_LEN] ;
//initialise class array
double* m_wavData = new double[m_wavsize*m_channels] ;
printf ("Opened file '%s'n", m_fileName) ;
printf ("Sample rate : %dn", m_samplerate) ;
printf ("Channels : %dn", m_channels) ;
printf ("Size : %dn", m_wavsize) ;
puts ("") ;
//fill array with the wav channel
int readcount(0);
int counter(0);
while ((readcount = sf_read_double (infile, data, BUFFER_LEN)))
{
// printf("%i n",counter);
// counter++;
process_data (m_wavData,data, readcount, m_channels) ;
} ;
/* RAII takes care of destroying SndfileHandle object. */
} /* read_file */
wavF::wavF(const unsigned int wavsize,const unsigned int channels,const unsigned int samplerate,const char * fileName):
m_channels(channels),m_samplerate(samplerate),m_wavsize(wavsize),m_fileName(fileName)
{
}
static void process_data (double *m_wavData,double *data, int count, int channels)
{
int k;
/* Process the data here.
** If the soundfile contains more then 1 channel you need to take care of
** the data interleaving youself.
*/
for (k = 0 ; k < channels*count ; k ++)
m_wavData [k] = data[k] ;
} /* process_data */
wavF::~wavF()
{
delete m_wavData;
printf("array is detroyed");
}
int initwav(SNDFILE *infile,SndfileHandle file, const char * fName)
{
SF_INFO sfinfo ;
if (! (infile = sf_open (fName, SFM_READ, &sfinfo)))
{ /* Open failed so print an error message. */
printf ("Not able to open input file %s.n", fName) ;
puts (sf_strerror (NULL)) ;
return 1;
} ;
return 0;
}
我写了什么编码异端?任何建议吗?
(audio wav在uiowa.edu数据库中找到)谢谢你。
谢谢大家!有几个错误:1)正如jean - franois Fabre指出的那样,缓冲区大小不正确,导致试图在数组m_wavData
中写入数据,从包含wav值data
的数组中取出值。--> m_wavData = new double[m_wavsize*m_channels] ;
2)正如WhozCraig指出的那样,我在类的构造函数中重新声明了变量m_wavData
,从而隐藏了同名的成员变量。-->已删除的重新声明。
3) molbdnilo指出,参数infile
对我使用它的方式没有影响,导致不能读取wav数据。——>通过在init和构造函数中打开来解决这个问题。
4)我一直在写数组m_wavData
的相同情况(缓冲区的大小)。-->在良好的情况下增加了计数器。
这是我的解决方案在一个更小的版本(π α ντα ρ ε ε):
#include <sndfile.h>
#include <stdio.h>
#define BUFFER_LEN 1024
#include <sndfile.hh>
class wavF
{
public:
wavF(SNDFILE *infile, SndfileHandle file,const char * fName);
void prinvalue(int k);// help to see if the values are good
~wavF();
protected:
unsigned int m_wavsize;
unsigned int m_channels;
unsigned int m_samplerate;
const char * m_fileName;
double * m_wavData;
};
int main(void)
{
// initiate variables to open the file
SNDFILE *infile ;
const char *infilename = "test.wav" ;
SndfileHandle file;
file=SndfileHandle(infilename);
SF_INFO sfinfo ;
if (! (infile = sf_open (infilename, SFM_READ, &sfinfo)))
{ /* Open failed so print an error message. */
printf ("Not able to open input file %s.n", infilename) ;
puts (sf_strerror (NULL)) ;
return 1;
} ;
wavF wav1(infile, file, infilename);
wav1.prinvalue(1000);//test if the value inside of the wav is correct
sf_close (infile);
/* Close input and output files. */
return 0 ;
}
void wavF::prinvalue(int k)
{
printf("the value is %lf",m_wavData[k]);
}
wavF::wavF(SNDFILE *infile, SndfileHandle file,const char * fName):m_channels(file.channels()),m_samplerate(file.samplerate()),m_wavsize(file.frames()),m_fileName(fName)
{ //declaration of the allocated arrays
static double* data= new double [BUFFER_LEN*m_channels] ;
m_wavData = new double[m_wavsize*m_channels] ;
printf ("Opened file '%s'n", m_fileName) ;
printf ("Sample rate : %dn", m_samplerate) ;
printf ("Channels : %dn", m_channels) ;
printf ("Size : %dn", m_wavsize) ;
puts ("") ;
int readcount(0);//number of data in the buffer
int counter(0);// number of time buffer is used
while ((readcount = sf_read_double (infile, data, BUFFER_LEN*m_channels)))
{
int k;
for (k = 0; k < readcount ; k ++)
{
m_wavData[counter*readcount+k] = data[k] ;//put data in the array
}
counter++;
printf("the wav value is %lf n",m_wavData[counter*readcount-1]);//look if the stored values are good
} ;
delete[] data; //clear allocated buffer array
} /* read_file */
wavF::~wavF()
{
delete[] m_wavData;
}
- 尝试使用来自 Win32 WASAPI C++的"捕获流"创建 wav 文件
- 如何从wav文件中获取采样率?
- 写入 wav 文件时定期创建静音
- 在不打开应用程序的情况下在MinGW c++中播放声音(.wav)文件
- 如何使用curl c ++源代码发布wav文件数据,如何使用c ++使用--data-binary?
- 为什么 XAudio2 仅在系统暂停时播放.wav文件?
- 处理文件期间输出失真.wav
- webRTC : 如何通过从WAV文件获得的样本将webRTC的VAD应用于音频
- WAV文件停止功能
- 如何从特定点播放.WAV文件(例如30秒)
- 通过C(或C )中的WAV文件循环
- 开放式阅读WAV文件lib
- 使用C++ / Python的wav文件的FFT
- 在mbed中打开的wav文件数量是否有限制
- 音频编程 SDL - 如何使用 wav 文件在命令行中指定频率切割
- 无法使用两种不同的频率填充 *.wav 文件的缓冲区
- 禁用在使用QAudioRecorder时创建wav文件
- 无论如何,我可以从WAV文件中打印Sox即可打印幅度值
- WAV文件的数据在-1和1之间,C ,SNDFILE
- 在黑莓10(原生)上分割音频文件(wav)