3

我一直在从 .Wav 文件中读取 int 的时间。我一直遵循此处列出的 .wav 规范。我正在尝试从标头中读取一个 int (Subchunk2Size),然后将数据读取到一个短裤数组中。我遇到了 fread() 和 ifstream.read() 的障碍。我将列出我的两个阅读技巧问题,但实际上只需要一个答案。

fread()

    sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
FILE * infile = fopen(filename, "rb");
if (infile != NULL)
{
    int f = ferror(infile);
    int d = fseek(infile, 40, SEEK_SET);
    int * subChunk2Size = new int[1];
    int i = fread(subChunk2Size, sizeof(int), 1, infile);
    int g = ferror(infile);

问题: fread 不读取任何内容, i 始终初始化为 0。

我尝试了声明 subChunk2Size 的许多不同组合,尝试声明一个指针、一个数组 - 具有单个和多个元素,声明一个 nullptr,声明一个 int 并传入它的引用。

ifstream.read()

    sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
ifstream sampleStream(filename,ios::binary);
char * samplesStr;

if (sampleStream.is_open())
{
    sampleStream.seekg(40);
    char * subChunk2SizeStr = new char[4];
    sampleStream.read(subChunk2SizeStr, 4);
    int subChunk2Size = 0;
    for (int i = 3; i >= 0; i--)
    {
        subChunk2Size = (subChunk2Size << 8) + subChunk2SizeStr[i];
    }
    int numBytes = subChunk2Size + *nsamples * 2;
    char * samplesStr = new char[numBytes];
    sampleStream.read(samplesStr, numBytes);
    sampleStream.close();
    short * samples = new short[numBytes / 2];
    for (int i = 0; i < numBytes / 2; i++)
    {
        int b = i * 2;
        samples[i] = samplesStr[b+1];
        samples[i] = (samples[i] << 8) + samplesStr[b];
    }

问题:我的第一次读取和位移得出了大约 22,000 的正确答案,但我无法在第二个循环中读取短裤。

我要感谢任何人考虑我的问题。

4

1 回答 1

3

我拿了你的代码,稍微修改了一下,当我使用每个样本 16 位的立体声输入时,它似乎显示出合理的结果,比如这个

#include <fstream>
#include <cstdio>
#include <iostream>
#include <climits>

using namespace std;

int main()
{
    const char *filename = "audio/M1F1-int16-AFsp.wav";
    ifstream sampleStream(filename,ios::binary);
    int nsamples = 10000;
    short * samples;
    if (sampleStream.is_open())
    {
        sampleStream.seekg(44);  // Skip all of the header. 
        samples = new short[nsamples];
        sampleStream.read(reinterpret_cast<char *>(samples), sizeof(short)*nsamples);
        sampleStream.close();
    }
    short max = 0; 
    short min = 32767;
    int min_at = 0; 
    int max_at = 0;
    for(int i = 0; i < nsamples; i++)
    {
        if (samples[i] > max) 
        {
            max = samples[i];
            max_at = i;
        }
        if (samples[i] < min)
        {
            min = samples[i];
            min_at = i;
        }
    }
    cout << "Max=" << max << " at " << max_at << endl;
    cout << "Min=" << min << " at " << min_at << endl;
}

它在样本 990 [立体声中的样本 495] 处显示了 14325 的顶峰,在 8766 处显示了 -7125 的最低水平,当与 Audacity 软件中的值进行比较时,两者都匹配。请注意,我依赖机器上的 x86 处理器是小端。如果您在 Mac 上运行,那么情况也是如此,除非它是一台非常旧的 PowerPC Mac。

于 2013-08-18T22:27:50.233 回答