gpt4 book ai didi

C++ RIFF WAVE 阅读器速度非常慢

转载 作者:行者123 更新时间:2023-12-03 01:44:12 24 4
gpt4 key购买 nike

所以我以前从未真正使用过二进制文件,而且我是 C++ 新手。我想读取一个 wav 文件并将其数据部分输出到一个 txt 中(用逗号分隔每个样本的值)。我还设法阅读了标题部分,但这段代码在这里并不重要,所以我不会包含它。

我的 wav 文件以 32bps 的 IEEE 754 标准(浮点数)存储数据。我首先将整个 wav 文件读入一个 char vector ,然后尝试使用它。程序的输出是我所期望的,我可以通过读取 txt 在 Python 中播放声音而不会出现问题。该程序非常慢(几秒钟长的wav文件需要几分钟)。

这是wavReader.cpp :

#include "stdafx.h"
#include "wavFile.h"
#include <fstream>
#include <iostream>
#include <vector>

int main()
{
std::ifstream file("file.wav", std::ios::binary);
std::vector<char> buffer((
std::istreambuf_iterator<char>(file)),
(std::istreambuf_iterator<char>()));
std::cout << "Loading complete!\n";

WavFile wavFile = setWavFile(buffer);

return 0;
}

这是 wavFile.h :
#pragma once
#include <iostream>
#include <vector>

struct WavFile
{
uint32_t dataSize;
};

WavFile setWavFile(std::vector<char> buffer);
uint32_t getUint32(std::vector<char> buffer, std::vector<char>::iterator it);

这是 wavFile.cpp :
#include "stdafx.h"
#include "WavFile.h"
#include <fstream>

WavFile setWavFile(std::vector<char> buffer) {

WavFile wavFile;
std::vector<char>::iterator it = buffer.begin();

// Beginning of data chunk is marked with "data"
it += 4;
while (*(it - 4) != 'd' ||
*(it - 3) != 'a' ||
*(it - 2) != 't' ||
*(it - 1) != 'a')
it++;

wavFile.dataSize = getUint32(buffer, it), it += 4;
std::ofstream output("data.txt");

while (it != buffer.end())
{
char outputChar[4];
for (int i = 0; i < 4; (i++, it++))
outputChar[i] = *it;
char* outputStr = outputChar;
char** outputStrPtr = &outputStr;
float** outputPtr = reinterpret_cast<float**>(outputStrPtr);
output << **outputPtr << ", ";
std::cout << static_cast<double>(std::distance(buffer.begin(), it)) * 100 / wavFile.dataSize << "\%\n";
}

return wavFile;
}

uint32_t getUint32(std::vector<char> buffer, std::vector<char>::iterator it)
{
char outputChar[4];
for (int i = 0; i < 4; (i++, it++))
outputChar[i] = *it;
char* outputStr = outputChar;
char** outputStrPtr = &outputStr;
uint32_t** outputPtr = reinterpret_cast<uint32_t**>(outputStrPtr);
return **outputPtr;
}

我让程序将进度打印到控制台。请注意,这仅适用于具有一个 channel 并将样本存储在 IEEE 754 标准中的 wav 文件。你可以找到我使用的文件 here .我只是一个业余程序员,所以请原谅我不知道是什么让我的程序这么慢......是 vector 迭代吗?还是 reinterpret_cast 的变量声明有点困惑?

最佳答案

也许进度打印会减慢速度?你打印很多。也许您可以尝试仅在百分比的积分值发生变化时打印,例如:

int lastPercent = -1;

loop {
...
float percent = ...;
int integralPercent = (int)percent;
if (integralPercent!=lastPercent) {
lastPercent = integralPercent;
// print percent here
}
}

关于C++ RIFF WAVE 阅读器速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44999827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com