ios 绘制wav波形图

最近研究了如何在iOS上绘制wav波形图。查了很多资料,都没能找到一个很完整的介绍,我这里总结一下一些经验。
首先需要了解wav的这3个重要指标:采样率、采样位数、声道数。下面以16KHz, 16Bit, 单声道为例来说明。
采样率:(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,单位用赫兹(Hz)来表示。采样频率的倒数是采样周期(也 称为采样时间),它表示采样之间的时间间隔。采样率为16KHz,表明每秒钟采样有16K次,即0.001秒内采集16个值。
采样位数:即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。声卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。16Bit表示用计算机的16位(即2字节)来标示一个值。
声道数:是指支持能不同发声的音响的个数。常见的有单声道和双声道。
比特率:每秒传送的比特(bit)数,等于采样率*采样位数,单位为bps(Bit Per Second)。示例音频的比特率为256kbps。
C语言没有提供专门的wav音频文件处理框架,因此,我们只能通过读取文件的2进制值来分析wav音频的波形。这里就需要对wav音频的格式有一定的了解。
wav音频分为文件头和数据块两大部分。
表1 WAV文件的文件头
|
偏移地址 |
字节数 |
类型 |
内容 |
|
00H~03H |
4 |
字符 |
资源交换文件标志(RIFF)注意字符大小写! |
|
04H~07H |
4 |
长整数 |
从下个地址开始到文件尾的总字节数 |
|
08H~0BH |
4 |
字符 |
WAV文件标志(WAVE)注意字符大小写! |
|
0CH~0FH |
4 |
字符 |
波形格式标志(fmt)注意字符大小写! |
|
10H~13H |
4 |
整数 |
过滤字节(一般为00000010H) |
|
14H~15H |
2 |
整数 |
格式种类(值为1时,表示数据为线性PCM编码) |
|
16H~17H |
2 |
整数 |
通道数,单声道为1,双声音为2 |
|
18H~1BH |
4 |
长整数 |
采样频率 |
|
1CH~1FH |
4 |
长整数 |
波形数据传输速率(每秒平均字节数) |
|
20H~21H |
2 |
整数 |
数据的调整数(按字节计算) |
|
22H~23H |
2 |
整数 |
样本数据位数 |
表2 WAV声音文件的数据块
|
偏移地址 |
字节数 |
类型 |
内容 |
|
24H~27H |
4 |
字符 |
数据标志符(data)注意字符大小写! |
|
28H~2BH |
4 |
长整型 |
采样数据总数 |
|
2CH... |
... |
... |
采样数据 |
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:
RIFF WAVE Chunk,位置00H~0BH。
Format Chunk,以'fmt'作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的附加信息。位置0CH ~23H。
Fact Chunk,可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
Data Chunk,是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。从24H开始。
其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。
在了解了wav文件的结构后,我们就可以轻松的取出wav的相应信息了。接下来就是绘制曲线,我们使用Quartz来绘图。苹果官方提供了一套例子,参考
http://developer.apple.com/library/ios/#samplecode/QuartzDemo/Introduction/Intro.html
其中关键是QuartzView和QuartzLines这两个文件。在QuartzLines.m文件中可以找到我们想要的绘制曲线方法,可以作为参考。
接下来的事情就很简单了,我们只需要从2CH的位置开始,每2个字节(与采样位数有关)的取数据,然后画到屏幕中。因此,音频数据点的个数为:采样数据总
数/2。如果需要将图像绘制到界面上,x坐标范围10~310,y坐标范围200~400,只需要将这些点做个映射就行了。
注意:
源码中只考虑了没有Fact Chunk的情况。实际上在读取data的时候应该加上判断
if(strcmp(id, "data")!=0){//not eq data
//TODO 读取Fact Chunk
//结构是4字节的Fact Chunk数据长度+Fact Chunk数据
}
//---------------------------以上数据为转载数据---------------------------------//
后面添加两个下载连接:
参考示例QuartzLines.m(为了达到更好的显示效果,对y进行了放大处理)
http://download.csdn.net/detail/daiyelang/6617369
demo:
http://download.csdn.net/detail/daiyelang/6617383
ios 绘制wav波形图的更多相关文章
- C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)
NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...
- SurfaceView绘制录音波形图
本文简单记录由View绘制转为SurfaceView绘制的波形图问题. 上代码: public class VoiceLineView extends View { private final int ...
- Python绘制wav文件音频图(静态)[matplotlib/wave]
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 绘制波形图 plottingWaveform.py "&qu ...
- 应用wavesurfer.js绘制音频波形图小白极速上手总结
一.简介 1.1 引 人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博 ...
- iOS绘制坐标图,折线图-Swift
坐标图,经常会在各种各样的App中使用,最常用的一种坐标图就是折线图,根据给定的点绘制出对应的坐标图是最基本的需求.由于本人的项目需要使用折线图,第一反应就是搜索已经存在的解决方案,因为这种需求应该很 ...
- 转:iOS绘制一个UIView
绘制一个UIView 绘制一个UIVIew最灵活的方式就是由它自己完成绘制.实际上你不是绘制一个UIView,你只是子类化了UIView并赋予子类绘制自己的能力.当一个UIVIew需要执行绘图操作的时 ...
- iOS 绘制1像素的线
一.Point Vs Pixel iOS中当我们使用Quartz,UIKit,CoreAnimation等框架时,所有的坐标系统采用Point来衡量.系统在实际渲染到设置时会帮助我们处理Point到P ...
- iOS绘制线条的使用
1.相关简介 1.1.iOS之UIBezierPath贝塞尔曲线属性简介 1.2.iOS之CAShapeLayer属性简介 2.绘制曲线 2.1.方法详解 - (void)addQuadCurveTo ...
- C# NAudio录音和播放音频文件及实时绘制音频波形图(从音频流数据获取,而非设备获取)
下午写了一篇关于NAudio的录音.播放和波形图的博客,不太满意,感觉写的太乱,又总结了下 NAudio是个相对成熟.开源的C#音频开发工具,它包含录音.播放录音.格式转换.混音调整等功能.本次介绍主 ...
随机推荐
- (转)安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
在安装Apache的过程中出现: 仔细查看提示: make_sock: could not bind to address 0.0.0.0:80 恍然大悟,计算机上安装了IIS7,80端口已占用. 打 ...
- MSSQL查询所有数据库表,指定数据库的字段、索引
--查询所有数据库USE mastergoselect [name] from [sysdatabases] order by [name] --查询其中一个数据库test,就可以得到这个数据库中的所 ...
- oracle 复制一条记录只改变主键不写全部列名
场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中. procedure P_TES ...
- Swift中出现“no such module cocoa”的错误
在Swift开发中,新建了一个UIViewController的子类出现“No such module 'Cocoa' 的错误, 头部是import cocoa.. 原因很简单:在建立新的File文件 ...
- C#中英文混合字符串过长截断
/// <summary> /// 截断字符串 /// </summary> /// <param name="maxLength">最大长度& ...
- 新安装ubuntu后几项配置
新安的ubuntu13.04 为了编程方便 进行如下设置 安装右键terminal sudo apt-get install nautilus-open-terminal 安装远程连接ssh ...
- C#操作Excel开发报表系列整理(转)
C#操作Excel进行报表开发系列共写了七篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...
- ulimit小结
1. limits是一个进程的资源,会被子进程继承 2. soft limit -S, hard limits -H hard limits只能被root用户修改,启动的时候会加载配置/etc/s ...
- css3 之表格隔行分色显示
<html> <head> <title></title> <style type="text/css"> table{ ...
- TextView 超链接点击跳转到下一个Activity
1:activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/androi ...