电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 图形图象
php分析.wav文件并绘制png格式的波形图_php技巧
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

  用Php分析并绘制音频文件的波形图,网上还是很少见到。其实只要根据wav文件的规范,用Php的fseek,fopen,fopen,pack/unpack等函数,以及强大的gd图形库,这些都是很容易的。很多人可能对pack/unpack函数不熟悉;这其实是Php借用perl的,他们提供了使用脚本语言访问复杂二进制数据结构的方法。我的这段简化的程序只能处理PCM格式的RIFF音频文件(这也是最常见的wav格式) ,不限声道,但是比特率(BitsPerSample)最好是16。

  这里有wave file format 和 MicroSoft wave soundfile format可以参考。这里是一个实际的例子(下载放大看)

  

以下是引用片段:

  1 <?Php
  2

  3 function wav_graph($file, $f=0, $w=0)

  4 {

  5 global $DATA_DIR;

  6

  7 if(!is_file($file)) return 0;

  8 $fp = fopen($DATA_DIR.$file, r);

  9 $raw = fread($fp, 36);

  10 $str = ;

  11 $header = unpack(A4Riff/VSize/A4Wav/A4Head/VHeadSize/vPCM/vChannels/VSampleRate/VByteRate/vBlockAlign/vSampleBits, $raw);

  12 foreach($header as $k=>$v)

  13 $str .= $k.: . $v. ;

  14 fseek($fp, 36 + $header[HeadSize] - 16);

  15 $raw = fread($fp, 8);

  16 $data = unpack(A4Data/VDataSize, $raw);

  17 foreach($data as $k=>$v)

  18 $str .= $k.: . $v. ;

  19

  20 $b = $header[SampleBits];

  21 $c = $header[Channels];

  22 $l = $b * $c / 8; // sample frame length in bytes

  23 $s = $data[DataSize] / $l; // total number of samples

  24 $r = $header[SampleRate];

  25 if($f) $h = pow(2, $b) / $f;

  26 else { $h = 200; $f = pow(2, $b - 1) / $h; }

  27 if($w == 0) $w = round($r / 1000); // default to show 1k sample frames per minute

  28

  29 header("Content-type: image/png");

  30 $im = imagecreate($s / $w, $h * $c * 2);

  31 imagecolorallocate($im, 0xff, 0xff, 0xff); // white bg

  32 $color = imagecolorallocate($im, 0, 0, 255); // black

  33 //imagestring($im, 5, 5, 5, $str, $color);

  34

  35 $x=0; $y = array(); $yn = array();

  36 for($i = 0; $i < $c; $i++) $y[$i] = $h * $i + $h;

  37 $n = $l * $w;

  38 while(1)

  39 {

  40 if($s == 0) break;

  41 if($s < $n) $n = $s;

  42 $samples = fread($fp, 1000 * $n);

  43 if($samples === FALSE) break;

  44 $packed = unpack("s*", $samples);

  45 foreach($packed as $k=>$v)

  46 {

  47 $cnt = ($k-1) % ($w * $l) ;

  48 if( $cnt > $c - 1) continue;

  49 $yn[$cnt] = $h * $cnt + $h - $v / $f;

  50 imageline($im, $x, $y[$cnt], $x+1, $yn[$cnt], $color);

  51 $y[$cnt] = $yn[$cnt];

  52 $x++;

  53 }

  54 $s -= $n;

  55 }

  56

  57 imagepng($im);

  58 imagedestroy($im);

  59 }

  60

  61 //wav_graph(audio2.wav);

  62 ?>
 


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·vb从零开始编外挂(十)_visualbasic教程
·google测试gbuy在线支付系统 挑战paypal_google动态
·photoshop制作漂亮美味果冻字_photoshop教程
·photoshop文字特效:逼真立体镏金字_photoshop教程
·photoshop轻松打造燃烧后的报纸特效_photoshop教程
·在php中全面阻止sql注入式攻击之一 _php技巧
·将系统装到u盘中 如何自制xp@usb启动盘_windows xp
·photoshop字体特效--华夫字效_photoshop教程
·fireworks巧绘水晶葡萄_fireworks教程
·linux程式设计-11.shellscript(bash)--(2)教学例_shell教程

最新文章
·在MySQL中增添新用户权限的方法简介
·CSS 循序渐进(一)画个瓢
·ASP.NET中数据校验部分的封装与应用
·为ASP.NET 2.0菜单控件增加target属性
·PHP5中的this,self和parent关键字详解
·很不错的使用频率比较高的JS函数
·将SSH与PHP相连接 确保传输数据的安全
·深入理解css中的position定位和z-index属性
·用JavaScript的日期对象操控时间和日期值
·用PHP和PEAR比较文件内容提交输出


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号