- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
目前,我已经根据可用的“libsndfile”示例代码编写了一个程序(在 Visual Studio C++ 中),其中我刚刚添加了一个减法函数,用于将一个( channel )WAV 文件与另一个相减.
该程序非常适合限制为 4 个 channel 的文件。
问题是,一旦我上传了一个包含多达 5 个 channel 或更多 channel 的文件,程序就拒绝执行该功能。这与帧大小无关,因为我设法处理了比我使用的一些 5/6 channel 文件大很多倍的 4 channel 文件。
有没有人遇到过这个或类似的问题?如果需要,我将提供源代码。
对于糟糕的结构,我深表歉意,在我完成整个交易之前,我不会真正优化。
代码:
#include <sndfile.hh>
#include <tinyxml2.h>
#include <iostream>
#include <fstream>
#define BLOCK_SIZE 32
using TiXmlDocument = tinyxml2::XMLDocument;
using CStdStringA = std::string;
int main(int argc, char* argv[])
{
SNDFILE *infile = NULL;
SNDFILE *infile2 = NULL;
SNDFILE *outfile = NULL;
SF_INFO sfinfo;
SF_INFO sfinfo2;
SF_INFO sfinfoOut;
sf_count_t readcount;
//int filetype = SF_FORMAT_WAV | SF_FORMAT_PCM_24; // 24-bit Wav-Files
TiXmlDocument iDoc; // Init tinyXML
int i; // Iteration-var;
short BufferIn[BLOCK_SIZE]; // Buffer1
short BufferIn2[BLOCK_SIZE]; // Buffer2
short BufferOut[BLOCK_SIZE];
CStdStringA FileLoc, FileName, FileLocWav, FileLocTxt,FileLocRaw; // OutputFile locationstring
CStdStringA WavName, WavName2, FileIn, FileIn2;
FileLoc = "C:\\Testfiles\\";
//TextTitle(FileLoc); // Print console-header
printf("Name Wavefile 1:\n");
std::cin >> WavName;
FileIn = FileLoc + WavName + ".wav";
if((infile = sf_open(FileIn.c_str(),SFM_READ,&sfinfo)) == NULL) // Open Wav-file 2 instance
{
printf("Not able to open input file 1\n");
printf("\n\nPress any key to exit."); // Exit-text if file not present
puts(sf_strerror(NULL)) ;
return 1;
}
std::cout << "Wav file 1 succesfully opened." << std::endl;
std::cout << "\nChannels: " << sfinfo.channels << "\nFrames: " << sfinfo.frames << std::endl; // Print Channels & Frames
std::cout << "Samplerate: " << sfinfo.samplerate << "\n\n" << std::endl;// Print Samplerate
printf("Name Wavefile 2:\n");
std::cin >> WavName2;
FileIn2 = FileLoc + WavName2 + ".wav";
if((infile2 = sf_open(FileIn2.c_str(),SFM_READ,&sfinfo2)) == NULL) // Open Wav-file 2 instance
{
printf("Not able to open input file 2\n");
printf("\n\nPress any key to exit."); // Exit-text if file not present
puts(sf_strerror(NULL)) ;
return 1;
}
std::cout << "Wav file 2 succesfully opened." << std::endl;
std::cout << "\nChannels: " << sfinfo2.channels << "\nFrames: " << sfinfo2.frames << std::endl; // Print Channels & Frames
std::cout << "Samplerate: " << sfinfo2.samplerate << "\n\n" << std::endl;// Print Samplerate
//{
//std::cout << "Format differs from eachother, abort program.";
//printf("\n\nPress any key to exit."); // Exit-text
//return 1;
//}
if(sfinfo.channels != sfinfo2.channels) // Abort if channels not the same
{
std::cout << "Channelammount differs from eachother, abort program.";
printf("\n\nPress any key to exit."); // Exit-text
return 1;
}
if(sfinfo.samplerate != sfinfo2.samplerate) // Abort if samplerate not the same
{
std::cout << "Samplerate differs from eachother, abort program.";
printf("\n\nPress any key to exit."); // Exit-text
return 1;
}
std::cout << "Give a filename for Txt- & Wav-file: ";
std::cin >> FileName;
FileLoc += FileName; // Fuse Filelocation with given name
FileLocTxt = FileLoc + ".txt";
FileLocWav = FileLoc + ".wav";
FileLocRaw = FileLoc + "Raw.txt";
sfinfoOut.channels = sfinfo.channels;
sfinfoOut.format = sfinfo.format;
sfinfoOut.samplerate = sfinfo.samplerate;
if((outfile = sf_open(FileLocWav.c_str(),SFM_WRITE,&sfinfoOut)) == NULL) // Open Wav-file 2 instance
{
printf("Not able to create output file \n");
printf("\n\nPress any key to exit."); // Exit-text if file not present
puts(sf_strerror(NULL)) ;
return 1;
}
std::ofstream myfile;
myfile.open(FileLocTxt.c_str(),std::ios::app);
std::ofstream myfileRaw;
myfileRaw.open(FileLocRaw.c_str(),std::ios::app);
while((readcount = sf_read_short(infile, BufferIn, BLOCK_SIZE))) // While there are still frames to be processed
{
//process_data (data, readcount, sfinfo.channels) ;
auto readcount2 = sf_read_short(infile2, BufferIn2, BLOCK_SIZE);
for(i = 0; i < BLOCK_SIZE; i++) // BLOCK_SIZE decides the chunk-size
{
BufferOut[i] = BufferIn[i] - BufferIn2[i];
myfileRaw << BufferOut[i];
}
sf_write_short(outfile, BufferOut, BLOCK_SIZE) ; // Write the data to a new file
}
sf_close(infile); // Close Wav-file handlers
sf_close(infile2);
sf_close(outfile);
myfile.close(); // Close text-file handlers
printf("\n\nPress any key to exit."); // Exit-text
return 0;
}
最佳答案
File Read Functions (Items)
sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ;The file read items functions fill the array pointed to by ptr with the requested number of items. The items parameter must be an integer product of the number of channels or an error will occur
这就是你的问题,因为 BLOCK_SIZE 是 1,2,4 的倍数,但不是 3 和 5 的倍数 - 所以会失败。
关于程序完成就好像已经进行了计算的问题:添加适当的错误处理。
关于c++ - 使用 libsndfile 处理大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19377942/
作为我学习 C++ 的一部分,我正在自学如何将 wav 文件读入 C++。我在网上找到了很多推荐以下库的资源:libsnfile library因此,我按照下面的一些教程来测试该库的基本功能,但我无法
作为我学习 C++ 的一部分,我正在自学如何将 wav 文件读入 C++。我在网上找到了许多推荐以下库的资源:libsnfile library所以我按照下面的一些教程测试了库的基本功能,但是我无法让
我正在编写一个处理音频文件的软件。我正在使用 libsndfile 库来读取 wave 文件数据,我遇到了一个他们的文档没有解决的疑问:读取项目的函数和读取帧的函数有什么区别?或者,换句话说,如果我交
Cmake 似乎没有找到 lib libsndfile。但是,它安装在我的机器上。 find_library(sndfile REQUIRED) 并安装: yum list installed | g
我正在使用 libsndfile 做一些简单的程序,目前正在尝试找到一种在音频文件中打印静音的方法 - 除了将另一个文件静音之外。表面上,我正在制作一台鼓机。在给定时刻,我只能写入输入音频文件的长度,
现在我在 iOS 上尝试使用 libsndfile 时遇到了一个奇怪的链接问题: 我已经在 MACOSX 10.6.8 上编译了 libsndfile 并通过了所有检查。但是当我将它添加到 Xcode
我正在尝试使用 MinGW 在 Windows 7 机器上用 C 语言编译程序。现在我不得不承认,我一开始并没有太多的 C 经验,而且我不是一个非常熟练的 Windows 用户,这使情况更加复杂。 程
我使用 libsndfile 和 wasapi 创建了一个应用程序,它允许使用 QSlider 使用光标手动缓慢播放音频文件。 我看到 libsndfile 使用帧,我想知道如何获取此音频文件的持续时
目前,我已经根据可用的“libsndfile”示例代码编写了一个程序(在 Visual Studio C++ 中),其中我刚刚添加了一个减法函数,用于将一个( channel )WAV 文件与另一个相
我正在尝试开发一个简单的c应用程序,它可以在wav文件中给定时间戳的特定频率范围内给出0-100之间的值。 示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围拆分为n个范围(从0开始
我正在尝试生成一个正弦波,它以 1 秒的间隔在立体声 wav 文件的左右声道之间切换,但我找不到任何方法来写入一个声道,同时保持另一个声道静音。这是我必须写入一个 channel 的代码: for (
我需要帮助开始使用 libsndfile。 我有四个 .wav 文件(都具有相同的采样率)。 我想把前两个连在一起,然后再把下两个连在一起, 然后将生成的 2 个 .wav 文件混合为一个。 最佳答案
我正在制作一个程序,从麦克风录音,然后使用 libsndfile 将其编码为 OGG 文件。 大约一个月前,我制作了这个程序的控制台版本,只是为了确保录制和编码功能良好。现在,当我开始将此程序作为窗口
我使用 libsndfile 库打开了 wav 文件,想要读取该文件并获取 FFT 中的 N 个点,并获取时域样本并计算 FFT。 有什么想法可以用 libsndfile 库中的函数替换 fscanf
因此,我一直在尝试使用 RtAudio 和 libsndfile。 任务看起来很简单: 1.) 使用 libsndfile 将一些样本读入缓冲区(使用 SndfileHandle 类和 readf()
谁能告诉我 portaudio 回调函数变量 framesperbuffer 是什么?如果我想通过 PA_WriteStream() 每次迭代以 64 字节数据播放音频流,那么我应该在 framesp
我正在尝试交叉编译 libsndfile 以便在具有 flac 功能的 intel edison 上使用。我已经成功地将 FLAC、OGG 和 VORBIS 编译到我的交叉工具链中,但是当我运行 ./
我正在尝试安装“libsndfile-dev”。我执行以下操作: sudo apt-get install libsndfile-dev 结果我得到以下内容: Reading package list
我刚从 Windows 切换到 Mac,我正尝试使用 brew 为我的一个 C 项目安装 libsndfile。但是安装之后还是在终端报错找不到,我好像也想不通是什么原因。 brew 安装 libsn
我刚从 Windows 切换到 Mac,我正尝试使用 brew 为我的一个 C 项目安装 libsndfile。但是安装之后还是在终端报错找不到,我好像也想不通是什么原因。 brew 安装 libsn
我是一名优秀的程序员,十分优秀!