C# 获取wave文件信息【转】
public class WaveHelper
{
/// <summary>
/// 数据流
/// </summary>
private Stream m_WaveData; private bool m_WaveBool = false; private RIFF_WAVE_Chunk _Header = new RIFF_WAVE_Chunk();
private Format_Chunk _Format = new Format_Chunk();
private Fact_Chunk _Fact = new Fact_Chunk();
private Data_Chunk _Data = new Data_Chunk();
public WaveHelper(string WaveFileName)
{
m_WaveData = new FileStream(WaveFileName, FileMode.Open);
try
{
LoadWave();
m_WaveData.Close();
}
catch
{
m_WaveData.Close();
}
}
public WaveHelper(Stream WaveStream)
{
m_WaveData = WaveStream;
try
{
LoadWave();
m_WaveData.Close();
}
catch
{
m_WaveData.Close();
}
}
private void LoadWave()
{
#region RIFF_WAVE_Chunk
byte[] _Temp4 = new byte[];
byte[] _Temp2 = new byte[];
m_WaveData.Read(_Temp4, , );
if (_Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[] || _Temp4[] != _Header.szRiffID[]) return;
m_WaveData.Read(_Temp4, , );
_Header.dwRiffSize = BitConverter.ToUInt32(_Temp4, );
m_WaveData.Read(_Temp4, , );
if (_Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[] || _Temp4[] != _Header.szRiffFormat[]) return; #endregion
#region Format_Chunk
m_WaveData.Read(_Temp4, , );
if (_Temp4[] != _Format.ID[] || _Temp4[] != _Format.ID[] || _Temp4[] != _Format.ID[]) return;
m_WaveData.Read(_Temp4, , );
_Format.Size = BitConverter.ToUInt32(_Temp4, );
long _EndWave = _Format.Size + m_WaveData.Position;
m_WaveData.Read(_Temp2, , );
_Format.FormatTag = BitConverter.ToUInt16(_Temp2, );
m_WaveData.Read(_Temp2, , );
_Format.Channels = BitConverter.ToUInt16(_Temp2, );
m_WaveData.Read(_Temp4, , );
_Format.SamlesPerSec = BitConverter.ToUInt32(_Temp4, );
m_WaveData.Read(_Temp4, , );
_Format.AvgBytesPerSec = BitConverter.ToUInt32(_Temp4, );
m_WaveData.Read(_Temp2, , );
_Format.BlockAlign = BitConverter.ToUInt16(_Temp2, );
m_WaveData.Read(_Temp2, , );
_Format.BitsPerSample = BitConverter.ToUInt16(_Temp2, );
m_WaveData.Position += _EndWave - m_WaveData.Position;
#endregion
m_WaveData.Read(_Temp4, , );
if (_Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[] && _Temp4[] == _Fact.ID[])
{
#region Fact_Chunk
m_WaveData.Read(_Temp4, , );
_Fact.Size = BitConverter.ToUInt32(_Temp4, );
m_WaveData.Position += _Fact.Size;
#endregion
m_WaveData.Read(_Temp4, , );
}
if (_Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[] && _Temp4[] == _Data.ID[])
{
#region Data_Chunk
m_WaveData.Read(_Temp4, , );
_Data.Size = BitConverter.ToUInt32(_Temp4, );
_Data.FileBeginIndex = m_WaveData.Position;
_Data.FileOverIndex = m_WaveData.Position + _Data.Size;
m_Second = (double)_Data.Size / (double)_Format.AvgBytesPerSec;
#endregion
} m_WaveBool = true; }
#region 文件定义
/// <summary>
/// 文件头
/// </summary>
private class RIFF_WAVE_Chunk
{
/// <summary>
/// 文件前四个字节 为RIFF
/// </summary>
public byte[] szRiffID = new byte[] { 0x52, 0x49, 0x46, 0x46 }; // 'R','I','F','F'
/// <summary>
/// 数据大小 这个数字等于+8 =文件大小
/// </summary>
public uint dwRiffSize = ;
/// <summary>
///WAVE文件定义 为WAVE
/// </summary>
public byte[] szRiffFormat = new byte[] { 0x57, 0x41, 0x56, 0x45 }; // 'W','A','V','E'
}
/// <summary>
/// 声音内容定义
/// </summary>
private class Format_Chunk
{
/// <summary>
/// 固定为 是"fmt "字后一位为0x20
/// </summary>
public byte[] ID = new byte[] { 0x66, 0x6D, 0x74, 0x20 };
/// <summary>
/// 区域大小
/// </summary>
public uint Size = ;
/// <summary>
/// 记录着此声音的格式代号,例如1-WAVE_FORMAT_PCM, 2-WAVE_F0RAM_ADPCM等等。
/// </summary>
public ushort FormatTag = ;
/// <summary>
/// 声道数目,1--单声道;2--双声道
/// </summary>
public ushort Channels = ;
/// <summary>
/// 采样频率 一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种
/// </summary>
public uint SamlesPerSec = ;
/// <summary>
/// 每秒所需字节数
/// </summary>
public uint AvgBytesPerSec = ;
/// <summary>
/// 数据块对齐单位(每个采样需要的字节数)
/// </summary>
public ushort BlockAlign = ;
/// <summary>
/// 音频采样大小
/// </summary>
public ushort BitsPerSample = ;
/// <summary>
/// ???
/// </summary>
public byte[] Temp = new byte[];
}
/// <summary>
/// FACT
/// </summary>
private class Fact_Chunk
{
/// <summary>
/// 文件前四个字节 为fact
/// </summary>
public byte[] ID = new byte[] { 0x66, 0x61, 0x63, 0x74 }; // 'f','a','c','t'
/// <summary>
/// 数据大小
/// </summary>
public uint Size = ;
/// <summary>
/// 临时数据
/// </summary>
public byte[] Temp;
}
/// <summary>
/// 数据区
/// </summary>
private class Data_Chunk
{
/// <summary>
/// 文件前四个字节 为RIFF
/// </summary>
public byte[] ID = new byte[] { 0x64, 0x61, 0x74, 0x61 }; // 'd','a','t','a'
/// <summary>
/// 大小
/// </summary>
public uint Size = ;
/// <summary>
/// 开始播放的位置
/// </summary>
public long FileBeginIndex = ;
/// <summary>
/// 结束播放的位置
/// </summary>
public long FileOverIndex = ;
}
#endregion
#region 属性
/// <summary>
/// 是否成功打开文件
/// </summary>
public bool WaveBool { get { return m_WaveBool; } }
private double m_Second = ;
/// <summary>
/// 秒单位
/// </summary>
public double Second { get { return m_Second; } }
/// <summary>
/// 格式
/// </summary>
public string FormatTag
{
get
{
switch (_Format.FormatTag)
{
case :
return "PCM";
case :
return "Microsoft ADPCM";
default:
return "Un";
}
}
}
/// <summary>
/// 频道
/// </summary>
public ushort Channels { get { return _Format.Channels; } }
/// <summary>
/// 采样级别
/// </summary>
public string SamlesPerSec
{
get
{
//switch (_Format.SamlesPerSec)
//{
// case 11025:
// return "11kHz";
// case 22050:
// return "22kHz";
// case 44100:
// return "44kHz";
// default:
// return _Format.SamlesPerSec.ToString() + "Hz";
//}
return _Format.SamlesPerSec.ToString();
}
} /// <summary>
/// 采样大小(比特率)
/// </summary>
public ushort BitsPerSample { get { return _Format.BitsPerSample; } }
#endregion
}
C# 获取wave文件信息【转】的更多相关文章
- C# 获取 mp3文件信息
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- android播放器如何获取音乐文件信息
转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...
- 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片
突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...
- C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】
C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ...
- PHP获取Mp3文件信息
扫描本地MP3文件,获取文件信息
- 工作采坑札记:4. Hadoop获取InputSplit文件信息
1. 场景 基于客户的数据处理需求,客户分发诸多小数据文件,文件每行代表一条记录信息,且每个文件以"类型_yyyyMMdd_批次号"命名.由于同一条记录可能存在于多个文件中,且处于 ...
- JAVA通过URL链接获取视频文件信息(无需下载文件)
最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...
- SQL SERVER获取数据库文件信息
MS SQL SERVER 获取当前数据库文件等信息,适用于多个版本: SELECT dbf.file_id AS FileID , dbf.name AS [FileName] , s.fi ...
- 获取mp4文件信息
计算电影长度 方法1 从mvhd - movie header atom中找到time scale和duration,duration除以time scale即是整部电影的长度. time scale ...
随机推荐
- 【转】mysql的cardinality异常,导致索引不可用
转自:http://ourmysql.com/archives/1343 前段时间,一大早上,就收到报警,警告php-fpm进程的数量超过阈值.最终发现是一条sql没用到索引,导致执行数据库查询慢了, ...
- 如何恢复低版本的FlashPlayer
本人做页游开发时,游戏用户那边经常会遇到一些很奇怪的问题.比如: 1.用户进入游戏,只显示游戏部分界面,chrome浏览器是正常的,就IE死活不行. 2.进入游戏时白屏或者一直加载不上. 3.玩游戏时 ...
- C++中string,wstring,CString的基本概念和用法
一.概念 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中.wstring是操作宽字符串的类.C++标准程序库对于string的设 ...
- cf219d
树形dp #include <cstdio> #include <vector> using namespace std; #define D(x) const int INF ...
- ios中的RunLoop 和 android 中的Looper
今天写android程序,用到了Handler,晚上回来查阅资料,发现了Looper这个概念. 看了一下网上关于Looper的资料,发现这个Looper跟ios中的Runloop基本的理念完全一致! ...
- 10. javacript高级程序设计-DOM
1. DOM DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口) 1.1 节点层次 DOM可以将任何HTML和XML文档描绘成一个由多层节点构成的结构.节点分为几种不同的类型 ...
- 关于CentOS普通用户无法登录SSH问题
在CentOS中,假若一切都顺利的话,你建新一个用户,它就自动添加到SSHD登录服务中的处的了,不必手动或再设置什么,但有些情况下,我们的系统只允许root用户登录,那么,我们就要进行一些必要的设置, ...
- code vs1706 求合数和(数论 素数的判定)
1706 求合数和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 用户输入一个数,然后输出 ...
- 【leetcode】Permutations (middle)
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- cocos2d-x 第二篇 HelloWorld的流程
这篇博客主要是带领大家一起了解整个游戏的执行过程,其中涉及的一些譬如导演,场景,层之类的概念将会在后面讲解. 看main函数的区别: #import <UIKit/UIKit.h> // ...