解析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格式文件波形绘制的更多相关文章

  1. 歌词文件解析(二):LRC格式文件的绘制

    通过对LRC文件的解析,可以轻松实现歌词可视化. 代码实现 函数名: paintLyrics(ByVal pBox As PictureBox, ByVal CurrentPosition As In ...

  2. 歌词文件解析(一):LRC格式文件的解析

    LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示.LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的基于纯文本的歌词专用 ...

  3. Android音频: 怎样使用AudioTrack播放一个WAV格式文件?

    翻译 By Long Luo 原文链接:Android Audio: Play a WAV file on an AudioTrack 译者注: 1. 因为这是技术文章,所以有些词句使用原文,表达更准 ...

  4. WAV格式文件无损合并&帧头数据体解析(python)(原创)

    一,百度百科 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频 ...

  5. wav格式文件、pcm数据

    wav格式文件是常见的录音文件,是声音波形文件格式之一,wav 文件由文件头和数据体两部分组成. 文件头是我们在做录音保存到文件的时候,要存储的文件的说明信息,播放器要通过文件头的相关信息去读取数据播 ...

  6. 将PCM格式存储成WAV格式文件

    将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...

  7. Unity的Json解析<二>–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  8. 【转】java将excel文件转换成txt格式文件

    在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...

  9. DEX文件解析--6、dex文件字段和方法定义解析

    一.前言    前几篇文章链接:       DEX文件解析---1.dex文件头解析       DEX文件解析---2.Dex文件checksum(校验和)解析       DEX文件解析--3. ...

  10. 批量将某一目录下的.py文件改为.txt格式文件

    #!/usr/env/python#-*- coding:utf-8 -*-#批量将某一目录下的.py文件改为.txt格式文件import os,os.pathfile_list = os.listd ...

随机推荐

  1. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  2. javascript的执行和预解析

    很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...

  3. 【Java】ThreadLocal细节分析

    ThreadLocal通过中文解释就是线程本地变量,是线程的一个局部变量.根据哲学家黑格尔“的存在即合理”的说法,ThreadLocal的出现肯定是有它的意义,它的出现也是因为多线程的一个产物.Thr ...

  4. nw.js如何处理拖放操作

    nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...

  5. 关于Windows高DPI的一些简单总结

    我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已 ...

  6. [nRF51822] 2、D-BUG之诗

    4线SPI彩屏局部刷屏偏移解决 ——原来我早已经在成功的旁边了 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF5182 ...

  7. Windows上帝模式,上帝应该就是这样使用Windows的

    Windows上帝模式(Windows Master Control Panel)由来已久,最早是从Win7优化大湿里看到的一个选项,开启后在桌面生成一个图标,点进去后里面包含了几乎全部Windows ...

  8. AWS re:Invent 2014回顾

    亚马逊在2014年11月11-14日的拉斯维加斯举行了一年一度的re:Invent大会.在今年的大会上,亚马逊一股脑发布和更新了很多服务.现在就由我来带领大家了解一下这些新服务. 安全及规范相关 AW ...

  9. Open Source Cassandra Gitbook for Developer

    Just released an open source Cassandra Gitbook for developer. http://teddymaef.github.io/learncassan ...

  10. swift 字符串和数字相互转化

    //NSString 类型 转为整型,浮点型, var test:NSString = "3.3" println("test\(test)") println ...