音频文件解析(二):WAV格式文件波形绘制
解析WAV头部信息后,接下来就可以根据相关参数和DATA块数据绘制波形.
1.重新编码(转换为8bits,单声道数据)
Public Function GetFormatData(ByVal pData() As Byte, ByVal pWaveHeader As waveHeaderStructre) As Byte() Dim temp As Integer Dim data() As Byte = {} Then ) data(i) = pData(i) Next Then - ) data(i) = pData(i * ) Next Then - ) temp = System.BitConverter.ToInt16(pData, i * ) / + temp = , , temp) temp = , , temp) data(i) = temp Next Then - ) temp = System.BitConverter.ToInt16(pData, i * ) / + temp = , , temp) temp = , , temp) data(i) = temp Next End If Return data End Function
2.显示波形
Public Sub PaintingWave(ByVal pData() As Byte, ByVal pWaveHeader As waveHeaderStructre, ByVal pBox As PictureBox) Dim pg As Graphics = pBox.CreateGraphics Dim pwidth As Integer = pBox.Width Dim pheight As Integer = pBox.Height Dim points As New List(Of PointF) Dim PImage As Bitmap = New Bitmap(pwidth, pheight) pg = Drawing.Graphics.FromImage(PImage) To pheight '绘制渐变背景 pg.DrawLine( + Math.Abs(i / (pheight / ) - ), , , ), ), , i, pwidth, i) Next '波形的离散数据点 points.Add())) Next pg.DrawLines(, , )), points.ToArray) pBox.Image = PImage pg.Dispose() End Sub
3.完整WAV分析封装类
实现功能:头部信息解析,重新编码,波形可视化
示例:
Dim SamplesWave As New WaveClass("F:\Music\李宗盛-山丘.wav")
SamplesWave.PaintWave(PictureBox1)
Class WaveClass Public waveHeadInf As waveHeaderStructre 'wav文件头部信息 Dim fileData() As Byte '文件原始数据 Public waveData() As Byte 'DATA块原始数据 Structure waveHeaderStructre 'RiffChunk Dim RIFF As String Dim FileSize As UInteger Dim WAVE As String 'FormatChunk Dim FORMAT As String Dim FormatSize As UInteger Dim FilePadding As UShort Dim FormatChannels As UShort Dim SamplesPerSecond As UInteger Dim AverageBytesPerSecond As UInteger Dim BytesPerSample As UShort Dim BitsPerSample As UShort Dim FormatExtra As UShort 'FactChunk Dim FACT As String Dim FactSize As UInteger Dim FactInf As UInteger 'DataChunk Dim DATA As String Dim DataSize As UInteger End Structure Public Sub New(ByVal FileName As String) fileData = My.Computer.FileSystem.ReadAllBytes(FileName) '加载wav文件 SplitWaveData(fileData) '分析头部,并获取DATA块数据 End Sub Public Sub PaintWave(ByVal pBox As PictureBox, Optional ByVal pData() As Byte = Nothing) '指定PictureBox绘制波形 If pData Is Nothing Then pData = GetFormatData() Dim pg As Graphics = pBox.CreateGraphics Dim pwidth As Integer = pBox.Width Dim pheight As Integer = pBox.Height Dim points As New List(Of PointF) Dim PImage As Bitmap = New Bitmap(pwidth, pheight) pg = Drawing.Graphics.FromImage(PImage) To pheight '绘制渐变背景 pg.DrawLine( + Math.Abs(i / (pheight / ) - ), , , ), ), , i, pwidth, i) Next '波形的离散数据点 points.Add())) Next pg.DrawLines(, , )), points.ToArray) pBox.Image = PImage pg.Dispose() End Sub Private Sub SplitWaveData(ByVal data As Byte()) '提取wav文件头部信息 waveHeadInf.RIFF = , ), String) waveHeadInf.FileSize = System.BitConverter.ToUInt32(data, ) waveHeadInf.WAVE = , ), String) 'FormatChunk waveHeadInf.FORMAT = , ), String) waveHeadInf.FormatSize = System.BitConverter.ToUInt32(data, ) waveHeadInf.FilePadding = System.BitConverter.ToUInt16(data, ) waveHeadInf.FormatChannels = System.BitConverter.ToUInt16(data, ) waveHeadInf.SamplesPerSecond = System.BitConverter.ToUInt32(data, ) waveHeadInf.AverageBytesPerSecond = System.BitConverter.ToUInt32(data, ) waveHeadInf.BytesPerSample = System.BitConverter.ToUInt16(data, ) waveHeadInf.BitsPerSample = System.BitConverter.ToUInt16(data, ) Then waveHeadInf.FormatExtra = System.BitConverter.ToUInt16(data, ) Else waveHeadInf.FormatExtra = End If tempIndex = + waveHeadInf.FormatSize 'FactChunk waveHeadInf.FACT = ), String) If waveHeadInf.FACT = "fact" Then waveHeadInf.FactSize = System.BitConverter.ToUInt32(data, tempIndex + ) waveHeadInf.FactInf = , System.BitConverter.ToUInt16(data, tempIndex + ), System.BitConverter.ToUInt32(data, tempIndex + )) tempIndex = tempIndex + waveHeadInf.FactSize + Else waveHeadInf.FACT = "NULL" waveHeadInf.FactSize = waveHeadInf.FactInf = End If 'DataChunk waveHeadInf.DATA = ), String) waveHeadInf.DataSize = System.BitConverter.ToUInt32(data, tempIndex + ) tempIndex = tempIndex + '提取DATA数据块 ReDim waveData(data.Length - tempIndex) Array.Copy(data, tempIndex, waveData, , data.Length - tempIndex) End Sub Private Function GetFormatData() As Byte() '重新编码 Dim temp As Integer Dim data() As Byte = {} Then ) data(i) = waveData(i) Next Then - ) data(i) = waveData(i * ) Next Then - ) temp = System.BitConverter.ToInt16(waveData, i * ) / + temp = , , temp) temp = , , temp) data(i) = temp Next Then - ) temp = System.BitConverter.ToInt16(waveData, i * ) / + temp = , , temp) temp = , , temp) data(i) = temp Next End If Return data End Function End Class
音频文件解析(二):WAV格式文件波形绘制的更多相关文章
- 歌词文件解析(二):LRC格式文件的绘制
通过对LRC文件的解析,可以轻松实现歌词可视化. 代码实现 函数名: paintLyrics(ByVal pBox As PictureBox, ByVal CurrentPosition As In ...
- 歌词文件解析(一):LRC格式文件的解析
LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示.LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的基于纯文本的歌词专用 ...
- Android音频: 怎样使用AudioTrack播放一个WAV格式文件?
翻译 By Long Luo 原文链接:Android Audio: Play a WAV file on an AudioTrack 译者注: 1. 因为这是技术文章,所以有些词句使用原文,表达更准 ...
- WAV格式文件无损合并&帧头数据体解析(python)(原创)
一,百度百科 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频 ...
- wav格式文件、pcm数据
wav格式文件是常见的录音文件,是声音波形文件格式之一,wav 文件由文件头和数据体两部分组成. 文件头是我们在做录音保存到文件的时候,要存储的文件的说明信息,播放器要通过文件头的相关信息去读取数据播 ...
- 将PCM格式存储成WAV格式文件
将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...
- Unity的Json解析<二>–写Json文件
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...
- 【转】java将excel文件转换成txt格式文件
在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...
- DEX文件解析--6、dex文件字段和方法定义解析
一.前言 前几篇文章链接: DEX文件解析---1.dex文件头解析 DEX文件解析---2.Dex文件checksum(校验和)解析 DEX文件解析--3. ...
- 批量将某一目录下的.py文件改为.txt格式文件
#!/usr/env/python#-*- coding:utf-8 -*-#批量将某一目录下的.py文件改为.txt格式文件import os,os.pathfile_list = os.listd ...
随机推荐
- RCP:【转载】插件无法启动的解决方案
有空了再翻译吧…… Table 2. Run configuration problems Problem Investigate During start you get error message ...
- Nim编码风格
介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- Linux 文件描述符和重定向
200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...
- [php入门] 4、HTML基础入门一篇概览
[php入门] 1.从安装开发环境环境到(庄B)做个炫酷的登陆应用 [php入门] 2.基础核心语法大纲 [php入门] 3.WAMP中的集成MySQL相关基础操作 1.HTML的作用 HTML是超文 ...
- Nginx做前端Proxy时TIME_WAIT过多的问题
我们的DSP系统目前基本非凌晨时段的QPS都在10W以上,我们使用Golang来处理这些HTTP请求,Web服务器的前端用Nginx来做负载均衡,通过Nginx的proxy_pass来与Golang交 ...
- Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"
最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local, 查出本地ruby安装的所有的包 这里可以看到i1 ...
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...