首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用BinaryReader解析Wave文件

用BinaryReader解析Wave文件
EN

Stack Overflow用户
提问于 2011-05-13 03:28:43
回答 4查看 1.5K关注 0票数 1

在.NET Assembly mscorlib System.IO命名空间中,我使用ReadInt16()方法遍历音频数据字节,并将有符号整数值转储到一个文本文件中。如何解释与一个采样率相关的两个值?也就是说,如果我有1秒的单声道数据,那么将有88200个字节,因此使用ReadInt16()将返回88200个离散整数。这是太多的信息,我应该只有44100个整数。那么,我是否需要使用不同的方法,或者可能在每次迭代中将循环前进1。

许多thanks..........Mickey

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-13 04:37:26

代码语言:javascript
复制
using System;
using System.IO;

public struct WaveFormat
{

    private short m_FormatTag;       // most often PCM = 1      
    private short m_nChannels;       // number of channels      
    private int m_SamplesPerSecond;  // samples per second eg 44100     
    private int m_AvgBytesPerSecond; // bytes per second eg 176000      
    private short m_BlockAlign;      // blockalign (byte per sample) eg 4 bytes         
    private short m_BitsPerSample;   // bits per sample, 8, 16, 24

    public WaveFormat(byte BPS, int SPS, byte nChn)
    {
        m_FormatTag = 1; //PCM
        m_nChannels = nChn;
        m_SamplesPerSecond = SPS;
        m_BitsPerSample = BPS;
        m_BlockAlign = (short)(m_nChannels * m_BitsPerSample / 8);
        m_AvgBytesPerSecond = (int)(m_BlockAlign * m_SamplesPerSecond);
    }
    public short FormatTag
    {
        get { return m_FormatTag; }
        set { m_FormatTag = value; }
    }
    public short Channels
    {
        get { return m_nChannels; }
    }
    public int SamplesPerSecond
    {
        get { return m_SamplesPerSecond; }
    }
    public int AvgBytesPerSecond
    {
        get { return m_AvgBytesPerSecond; }
    }
    public short BlockAlign
    {
        get { return m_BlockAlign; }
    }
    public short BitsPerSample
    {
        get { return m_BitsPerSample; }
    }
    public void Read(BinaryReader br)
    {
        m_FormatTag = br.ReadInt16();
        m_nChannels = br.ReadInt16();
        m_SamplesPerSecond = br.ReadInt32();
        m_AvgBytesPerSecond = br.ReadInt32();
        m_BlockAlign = br.ReadInt16();
        m_BitsPerSample = br.ReadInt16();
    }
    public void Write(BinaryWriter bw)
    {
        bw.Write(m_FormatTag);
        bw.Write(m_nChannels);
        bw.Write(m_SamplesPerSecond);
        bw.Write(m_AvgBytesPerSecond);
        bw.Write(m_BlockAlign);
        bw.Write(m_BitsPerSample);
    }
    public override string ToString()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.AppendLine("FormatTag:         " + m_FormatTag.ToString());
        sb.AppendLine("nChannels:         " + m_nChannels.ToString());
        sb.AppendLine("SamplesPerSecond:  " + m_SamplesPerSecond.ToString());
        sb.AppendLine("AvgBytesPerSecond: " + m_AvgBytesPerSecond.ToString());
        sb.AppendLine("BlockAlign:        " + m_BlockAlign.ToString());
        sb.AppendLine("BitsPerSample:     " + m_BitsPerSample.ToString());
        return sb.ToString();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2011-05-13 03:32:38

通常,当您读取数据数组时,代码应如下所示:

代码语言:javascript
复制
for(int i = 0; i < totalNumberOfEntries; i++)
{
  // read all data for this entry
  var component1 = reader.ReadXXX();
  var component2 = reader.ReadXXX();

  // deal with data for this entry
  someEntryStroage.Add(new Entry(component1, component2);
}

在你的例子中,最有可能的情况是(我不知道Int16文件格式),你要么需要读取成对的Wave值(如果样本在一起),要么需要单独读取通道,如果一个通道的数据是另一个通道的数据。

票数 0
EN

Stack Overflow用户

发布于 2011-05-13 03:48:12

你一定要读一下chunkinfos。data-chunk告诉你需要读取多少字节。WaveFormat会告诉你每秒钟的平均字节数,甚至更多。我有一些VB代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5983416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档