- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我决定在音频算法上使用 C++,更习惯于 Matlab 我有点挣扎。
第一步是使用 sndfile 库将一个 wav 文件记录到一个数组中。我使用了图书馆的例子:
https://github.com/michaelwu/libsndfile/blob/master/examples/sfprocess.c
我想创建一个 wavF 类,其中包含 wav 的一般信息(采样频率、 channel ...)和 wav 文件的数据以供进一步处理。
我几乎已经实现了这一点,但是在 wavfile 中输入 while ((readcount = sf_read_double (infile, data, BUFFER_LEN)))
循环(但不总是)时出现段错误.cpp。我不明白为什么。
我想将 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 : %d\n", m_samplerate) ;
printf ("Channels : %d\n", m_channels) ;
printf ("Size : %d\n", 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;
}
我写了什么编码异端?有什么建议吗?
(在 uiowa.edu 数据库中找到的音频 wav)谢谢。
最佳答案
谢谢大家!他们犯了几个错误:1) 正如 Jean-François 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 : %d\n", m_samplerate) ;
printf ("Channels : %d\n", m_channels) ;
printf ("Size : %d\n", 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;
}
关于c++ - 段错误和wav文件阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015575/
我会保持简短:我正在尝试循环遍历画廊的 xml 文档。我有一个应该可以工作的脚本,但没有。谁能告诉我哪里做错了? 我不想让它变得更长,因为问题很简单,并且从昨天开始就一直在思考这个问题,这是我得到的最
我正在使用 PHPExcel从 Excel 工作表中读取数据并存储在 mysql 表中,直到现在我能够上传 .xls 和 .xlsx 文件,在上传 xls 后我得到了下面的数据表结构 name
我正在构建一个在线 Rss 阅读器。我希望能够与文章标题和描述一起显示图像。 我正在使用谷歌提要 API 从 CNN ( http://rss.cnn.com/rss/edition.rss ) 读取
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 10年前关闭。 Improve this
我正在开发 BB 应用程序,我需要在其中实现 QR 阅读器或扫描仪。我知道 RIM 在 OS6 和 ZXing 中支持它的库,但实际上我需要阅读一个示例,说明如何在我的代码中实现它。 最佳答案 你可以
我将工作应用程序的 clojurescript 版本升级到 0.0-2030,突然读取器/读取字符串返回空值,例如: (js/alert (str "reader returned [" (read
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想编写一个小应用程序,可以从任何 RSS 提要 URL 中提取 RSS 提要。如果有人能给我关于如何实现这一目标的非常基本的帮助? 我刚刚开始接触 AJAX 之类的东西,所以任何帮助将不胜感激。 谢
我已经创建了一个 RSS 阅读器,如下教程所示: http://techiedreams.com/android-rss-reader-part-3-action-bar-with-animated-
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
请帮我解决这个问题。我是 extJs 的新手,我需要一点帮助。我有这个代码 Ext.onReady(function() { var datesStore = new Ext.data.JsonSt
我需要一个 CSV 读取器,它将输出 NxN(加权)邻接矩阵(N 从一开始就不知道)。当然,我可以使用 strtok() 和 friend 来解析它,但是如果某些东西已经可用并且足够完整,我将不胜感激
实际上我想开发一个 EPUB 格式的图书列表(列表将从网络服务中检索)。 当选择一个项目(一本书)时,它应该会提示手机中安装了可用的 epub 阅读器。类似于“分享”将调用 SMS、FB、Twitte
我是 Java 的新手,但真的想在这方面做得更好。我正在尝试编写一个简单的 RSS 阅读器。这是代码: import java.io.*; import java.net.*; public clas
我按照一个简单的教程 (http://www.cse.nd.edu/courses/cse40814/www/RSS_Android.pdf) 将给定 URL 中的 RSS 提要读取到 ListVie
最近我一直在尝试学习如何在 Xcode 6 beta 中制作 RSS 阅读器应用程序的教程,尽管我使用的是 Xcode 6.1。我遇到了一行似乎是错误的。 完整代码为: import UIKit cl
代码使用条形码扫描仪检查条形码。Search_code 由用户(键盘)填写,insert_code 由条码扫描仪自动填写。目前,如果在条形码扫描仪值中引入两个输入,则代码可以工作,这对我来说不起作用。
是否可以通过编程方式更改 Windows 中的默认 PDF 阅读器。 例如, 如果我的机器中的默认阅读器是“Foxit”,但我需要在 C# 或 javascript 中将默认阅读器应用程序更改为“Ad
我想将 CSV 文件的每一行与其自身以及一列中的每一行进行比较。 例如,如果列值是这样的: 值_1 值_2 值_3 代码应该选择 Value_1 并将其与 Value_1(是的,也与它本身)、Valu
我有以下片段 import csv data = {} with open('data.csv', 'rb') as csvfile: spamreader = csv.reader(csvf
我是一名优秀的程序员,十分优秀!