音频文件解析(二):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 ...
随机推荐
- smartsvn 用法
都说SMART SVN是最全的Mac上的SVN客户端工具,分Pro版和基础版,基础版跟Versions差不多,这里找了Pro版下载并破解:mac版本smartSVN客户端下载:http://www.s ...
- Kali Linux渗透测试实战 1.2 环境安装及初始化
1.2 环境安装及初始化 目录(?)[-] 环境安装及初始化 下载映像 安装虚拟机 安装Kali Linux 安装中文输入法 安装VirtualBox增强工具 配置共享目录和剪贴板 运行 Metasp ...
- 作业二--注册GitHub的过程
第一步:打开GitHub官网https://github.com/,在界面中输入账号名称.邮箱.密码,然后点击注册按钮. 第二步:注册完成后,选择Free免费账号完成初始设置. 第三步:验证邮箱,打开 ...
- 在.net中使用aquiles访问Cassandra(二)
上文中我们已经建立了项目的基本结构,今天实现数据的修改.在NoSQL中,通常添加和修改都认为是对数据的一种Mutation. 1.建立描述修改Row的实体. public class RowMut ...
- mongodb java spring data
关于如何集成spring-data-mongodb到项目中,已经有很多人介绍了,这里只给出几个链接. GETTING STARTED Accessing Data with MongoDB: http ...
- Atitit 图像处理30大经典算法attilax总结
Atitit 图像处理30大经典算法attilax总结 1. 识别模糊图片算法2 2. 相似度识别算法(ahash,phash,dhash)2 3. 分辨率太小图片2 4. 横条薯条广告2 5. 图像 ...
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- fir.im Weekly - Stanford 的 Swift 课程来了
上周提过,Swift 的 Github 主页上已经有了 >>「Port to Android」,这周重点推荐一下 Stanford 的 Swift 课程. Developing iOS 9 ...
- Liferay7 BPM门户开发之46: 集成Activiti用户、用户组、成员关系同步
在实际的BPM集成开发过程中,Liferay和Activiti这两个异构的系统之间,用户.组的同步需求非常重要,用来实现签收组的概念,比如指定签收组.会签.抢签都需要用到. Activiti可以通过自 ...
- StringUtils 的用法
1.public static boolean isEmpty(String str) 判断某字符串是否为empty,标准是 null == str 或 str.length() == 0 2.pub ...