所以我從來沒有真正使用過二進制文件,而我剛剛接觸C++。我想讀取一個wav文件並將其數據部分輸出到txt中(用逗號分隔每個樣本的值)。我也設法閱讀標題部分,但這段代碼在這裏並不重要,所以我不會包含它。C++ RIFF WAVE閱讀器很痛苦
我的wav文件以32bps的速度存儲IEEE 754標準的數據(浮點數)。我首先將整個wav文件讀入char向量,然後嘗試使用它。該程序的輸出是我期望的結果,我可以通過閱讀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;
}
我製作的節目打印進展控制檯。請注意,這隻適用於具有一個通道的wav文件,並將樣本存儲在IEEE 754標準中。你可以找到我使用的文件here。我只是一個業餘愛好程序員,所以請原諒我,我不知道是什麼讓我的程序變得很慢......是矢量迭代嗎?或者它是與reinterpret_cast有點亂的變量聲明?
其實你爲什麼不用python讀它?將音頻值轉換爲文本然後再轉換爲值似乎是一種矯枉過正。 – VTT
@VTT這不是一些實用的用途,而是我爲了理解WAVE文件的文件結構以及如何將二進制文件轉換爲通常可讀的文件而進行的練習。 – Keno