gpt4 book ai didi

audio - 读取WAV文件时,dataID打印为 “fact”而不是 “data”

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

我是音频播放的新手,并且整天都在阅读wav文件规范。我编写了一个简单的程序来提取文件头,但是现在我的程序始终返回false,因为DataID始终以“事实”而不是“数据”形式返回。

我认为有几种原因可能会发生这种情况。

  • 我正在读取的文件的格式大小为18,而this resource声明有效的PCM文件的格式大小应为16。
  • 我正在读取的文件的格式代码为6,意味着它可能已压缩。
  • dataSize的值太小(仅4)。通过VLC或Windows Media Player运行文件时,即使文件具有30秒的播放时间。

  • 我使用的代码如下:
    using (var reader = new BinaryReader(File.Open(wavFile, FileMode.Open)))
    {
    // Read all descriptor info into variables to be passed
    // to an ASWAVFile instance.
    var chunkID = reader.ReadBytes(4); // Should contain "RIFF"
    var chunkSize = reader.ReadBytes(4);
    var format = reader.ReadBytes(4); // Should contain "WAVE"

    var formatID = reader.ReadBytes(4); // Should contain "fmt"
    var formatSize = reader.ReadBytes(4); // 16 for PCM format.
    var formatCode = reader.ReadBytes(2); // Determines linear quantization - 1 = PCM, else it has been compressed
    var channels = reader.ReadBytes(2); // mono = 1, stereo = 2
    var sampleRate = reader.ReadBytes(4); // 8000, 44,100 etc
    var byteRate = reader.ReadBytes(4); // SampleRate * Channels * BitsPerSample / 8
    var blockAlign = reader.ReadBytes(2); // Channels * BitsPerSample / 8
    var bitsPerSample = reader.ReadBytes(2); // If mono 8, if stereo 16 etc.

    var padding = byteToInt(formatSize);

    // Read any extra values so we can jump to the data chunk - extra padding should only be set here
    // if formatSize is 18
    byte[] fmtExtraSize = new byte[2];

    if (padding == 18)
    {
    fmtExtraSize = reader.ReadBytes(2);
    }


    // Read the final header information in, we can then set
    // other
    var dataID = reader.ReadBytes(4); // Should contain "data"
    var dataSize = reader.ReadBytes(4); // Calculated by Samples * Channels * BitsPerSample / 8

    // Check if the file is in the correct format
    if (
    System.Text.ASCIIEncoding.Default.GetString(chunkID) != "RIFF" ||
    System.Text.ASCIIEncoding.Default.GetString(format) != "WAVE" ||
    System.Text.ASCIIEncoding.Default.GetString(formatID) != "fmt" ||
    System.Text.ASCIIEncoding.Default.GetString(dataID) != "data"
    )
    {
    return false;
    }


    //file = new ASWAVFile();
    }

    如果转储chunkID,format,formatID和dataID的值,则会得到:
    RIFF, WAVE, fmt, fact

    导致该方法返回false。为什么会这样呢?

    最佳答案

    RIFF规范不需要“数据”块跟随“fmt”块。您可能会看到一些文件在'fmt'块之后写入了'pad'块,以确保页面对齐以获得更好的流。

    http://en.wikipedia.org/wiki/WAV

    如您所述,格式代码还指示音频压缩类型。有效格式代码在mmreg.h中(在Windows上):(格式6是法律,实际上是压缩类型)。

    http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/Docs/MMREG.H

    最好的选择是编写可读取块头的代码,检查所需的类型,如果找不到所需的内容,则跳过该代码进入下一个块。

    关于audio - 读取WAV文件时,dataID打印为 “fact”而不是 “data”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356694/

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