旭东's profile东东的家PhotosBlogListsMore Tools Help

东东的家~

vitas :奉献

 

东东的家

June 29

面对酷暑,大家应该少上网,多参加社会活动

连日来气温有升无降,北京气温更超过40度大关,用电负荷1184万千瓦创入夏新高。炙热的空气是如此凝重,仿佛要将世界的一切都毁灭殆尽,而用电又是如此紧张,我们的相关部分在承受着巨大的供电压力,面对如此严峻的形势,身为守法公民,身为中华好儿女,我们不应袖手旁观,我们有义务也有能力为祖国做出自己应有的贡献。 

但是,身为一名程序员,我们仅仅是社会中最底层最微不足道的一份子,我们又能为国家做些什么呢?

答案很简单,既然司机同志们能够自觉自愿地按照尾号而“每周少开一天车”来严格要求自己,那么,我们这些程序员当然也可以通过“每周少上一天网”来减少社会资源的压力,为祖国的建设添砖加瓦了。 


要知道,每生产一部个人电脑需要相当于电脑重量十倍的矿物燃料和与其自重相仿的化学品,包括对人体有害的物质。相比之下,生产汽车和冰箱所需的矿物燃料只是其自重的一倍和两倍。而且全球目前每年要出售一亿三千万多部电脑,其大量能源消耗以及被废弃的电脑对环境和人体健康构成很大的威胁,就在此时此刻,因计算机问题而产生的各种废弃品也正在向土壤和地下水中不停的释放有毒物质。 

不止如此,互联上的错综复杂的内容,也极大的毒害着我们纯真的心灵。远的不说,仅以近期焦点访谈中高也同学的个人经历而言,我们也十分有必要减少对于互联网的依赖,以至最终彻底杜绝这类丑恶现象的发生。

哎!身为一名程序员,每每想到这些事情,我都不禁痛心疾首,自怨自艾起来。设想下,如果没有我们,没有网络,纵使社会将有小小的不便,但总体来说,我们的祖国将是多么的繁荣富强啊!祖国的青少年们将是多么纯真善良啊!

然而,为了我们这些人的个人利益,为了能给我们找份工作,祖国竟然一直容许着我们的存在,而每每主动替我们打扫那些因为我们而产生的不良信息,想到此处,我不禁潸然泪下。

庆幸的是,我国民众的眼睛是雪亮的,最新的网络民意调查格式被以新华及搜狐网为首的正义媒体所广泛采用,[ 完全赞成封杀google] ,即反对以google为代表的互联网不良信息率达到乃至超过了100% !具体请看下图:

00

天佑中华!俗话说得好啊,“自古奸佞倾社稷!岂有文章覆乾坤? ”,“从来大奸大恶辈,必是道貌岸然人”,可惜无论google多么狡诈,多么的蒙蔽群众,在我国正义的新闻及网络媒体面前始终不堪一击,终将自取灭亡。

然而,毕竟现今我们还在从事这低贱的营生,从事这有可能令某些人人心神不宁的活动,如果我们也仅仅学习“少开一天车”而“少上一天网”,那么每周也不过一天,零零散散的看不出的网络环境改善的实际效果,更不足以弥补当下那巨大的用电空缺。

因而鄙人将参考“少开一天车”的精神,而进一步发扬光大,聚零为整,化有限为无限——改“每周少上一天网”为“每年少上一月网”,进而“每年少上半年网”,直至实现“永远不再使用互联网及计算机”的伟大进步。

在这段时间内,为了尽可能减少互联网带来的已知及潜在危害,鄙人将采取“四不两没有一可能”的原则使用计算机,也就是——

面对有史以来最酷热的季节,无论是工作中或者生活中我都要做到“不关心一切网络事件、不浏览一切网络新闻、不排除一切网络故障、不开发一切网络程式——总之在这段时间内,就当世界上压根没有互联网及电脑这种东西,更没有必要帮助任何人或单位使用及接触互联网与电脑这种东西,相反可能会采取积极行动阻止身边的人或单位接触互联网及电脑 ”。

在以CCTV为代表的进步媒体的言传身教下,我意识到,在拥有世界上最强大网络防火墙及极品过滤软件的我国,即便我们这些蹩脚程序员全部歇业乃至统统滚蛋,也不会对社会产生任何不好的影响,相反会更加有利于社会的建设与发展。

在这些供电紧张的日子里,我们这些可有可无的废人,应该要——也有必要少看那些很黄很暴力的画面,少接触那些很傻很天真的信息,少受别有用心者的挑拨与利用;应该要——也有必要放弃上网及操作计算机的恶行,转而走上大街,多与同龄人聚会,多与大众沟通,多接触及团结进步青年,多关心时事,积极参与社会实践,为祖国的现代化事业添砖加瓦。

这样,我们就不会心神不宁的无所是从了,更不会沦落为不明真相的一小撮而不能自拔了,一言以括之——与其宅在家里,不如宅在街上。

___________________________________________________________________

系统自动生成的免责声明:


以上文章为[Java版文章自动生成系统]自动生成,软件作者利用Java Bot技术实现网站自动录入,全程无人为参与。其中符号、标点及中文语句皆为Random方式由自然语法库中检索采集而成。本文的诞生完全依赖于Java 平台及其衍生物[Java版文章自动生成系统],因而本文观点不能代表软件作者实际观点,软件作者使用此文更不代表软件作者支持或反对文中涉及内容,本文 仅作为但不限定于[Java版文章自动生成系统]使用示例之用。


软件作者将不对此文承担任何责任与义务,如有异议,请与Java平台供应商Oracle-Sun取得联系。


系統自動生成的免責聲明: 

以上文章為[Java版文章自動生成系統]自動生成,軟件作者利用Java Bot技術實現網站自動錄入,全程無人為參與。其中符號、標點及中文語句皆為Random方式由自然語法庫中檢索採集而成。本文的誕生完全依賴於Java 平台及其衍生物[Java版文章自動生成系統],因而本文觀點不能代表軟件作者實際觀點,軟件作者使用此文更不代表軟件作者支持或反對文中涉及內容,本文 僅作為但不限定於[Java版文章自動生成系統]使用示例之用。 

軟件作者將不對此文承擔任何責任與義務,如有異議,請與Java平台供應商Oracle-Sun取得聯繫。


免責事項を自動的に生成さ: 

この記事の[ Javaのバージョンについては、上記の記事は、自動的にシステムが生成]は自動的に、ソフトウェアの作者のサイトのJava技術ボット自動エントリー、 誰も全体のプロセスに関与を使用するように生成されます。どのシンボル、句読点や方法は、中国語の言語は、財務省からのコレクションを取得するためにラン ダムな自然な構文があります。この記事の誕生完全にJavaプラットフォームとその派生商品に依存しています[この記事のJavaバージョンを自動的にシ ステムを生成] 、したがって、この資料の表示は、ソフトウェアの作者の実用的なポイントの見解を示すことはできませんが、このソフトウェアの作者の著者もサポートした り、記事関係の内容に反対するソフトウェアという意味ではない、この資料を使用するように、この記事では、この記事はこれに限定されない[ Javaのバージョンを自動的にシステムが生成]の例を使用しています。 

異議があれば、Sun、 Oracle 、 Javaプラットフォームのプロバイダにお問い合わせくださいソフトウェアは、この資料には、著者は、すべての責任と義務を負うことはありません。


Automatically generated Disclaimer: 

The above article for the [Java version of the article automatically generated system] automatically generated, the software's author to use technology site Java Bot automatic entry, no one involved in the entire process. In which symbols, punctuation and the way the Chinese language are Random natural syntax to retrieve the collection from the Treasury. The birth of this article is totally dependent on Java platform and its derivatives [Java version of the article automatically generated system], and therefore can not represent the views of this article a practical point of view the software's author, the software's author to use this article the author also does not mean that software to support or oppose the contents of the article involved, this article only as but not limited to [Java version of the article automatically generated system] by the use of examples.

Software, this article the author will not assume any responsibilities and obligations, if any objections, please contact the Java platform provider to contact the Oracle-Sun.


Généré automatiquement Disclaimer: 

L'article ci-dessus pour l'[version Java de l'article généré automatiquement système] généré automatiquement, le logiciel de l'auteur à utiliser la technologie Java Bot site automatique, pas de celui en cause dans l'ensemble du processus. En ce qui les symboles, les signes de ponctuation et de la manière dont la langue chinoise sont aléatoires naturelles syntaxe pour récupérer la collection de la Trésorerie. La naissance de cet article est totalement dépendant de la plate-forme Java et de ses dérivés [Java version de l'article généré automatiquement système], et ne peut donc pas représenter les vues de cet article, un point de vue pratique, l'auteur du programme, l'auteur du programme à utiliser cet article, l'auteur ne signifie pas que le logiciel de soutenir ou de s'opposer au contenu de l'article en cause, cet article ne que, mais non limité à [Java version de l'article généré automatiquement système] par l'utilisation d'exemples. 

Software, cet article, l'auteur n'assume aucune des responsabilités et des obligations, si aucune objection, s'il vous plaît contacter le fournisseur de plate-forme Java, de prendre contact avec la base de données Oracle-Sun.


책임의 한계를 자동으로 생성 : 

문서의 [자바 버전은 위의 문서를 자동으로 시스템을 생성] 자동으로 소프트웨어의 저자는 자바 기술을 사이트 봇 자동 입력, 아무도 전체 과정에 참여를 사용하여 생성된. 어떤 기호, 구두점과 방법은 중국의 언어가 재무성에서 컬렉션 랜덤 천연 구문을 검색할 수있습니다. 이 문서의 탄생은 전적으로 자바 플랫폼과 그 파생 상품에 의존한다 [기사의 자바 버전이 자동으로 시스템을 생성], 따라서이 문서를 볼 소프트웨어의 저자의 실용적인 시점의 의견을 대변하지 못하면, 그 소프트웨어의 저자는 저자도 지원하거나 관련된 문서의 내용을 반대하는 소프트웨어 말은하지 않는 경우이 문서를 사용하려면이 문서는 문서의로 국한되지 않음 [자바 버전이 자동으로 시스템을 생성] 예제의 사용에 의해. 

이의가있는 경우, 오라클 - 썬은 자바 플랫폼 공급자에게 연락하여 문의하시기 바랍니다 소프트웨어,이 문서의 저자는, 어떤 책임과 의무를지지 않습니다.


Αυτόματα δημιουργείται Disclaimer: 

Το παραπάνω άρθρο για το [έκδοση Java του άρθρου αυτόματα σύστημα] αυτόματα δημιουργείται, το λογισμικό του συντάκτη της ιστοσελίδας να χρησιμοποιούν την τεχνολογία Java Bot αυτόματη θέση, κανείς δεν συμμετέχει στην όλη διαδικασία. Σε ποια σύμβολα, σημεία στίξης και τον τρόπο με τον οποίο η κινεζική γλώσσα είναι φυσικό Τυχαία σύνταξη, για να ανακτήσετε την είσπραξη από το ταμείο. Η γέννηση αυτού του άρθρου είναι εντελώς εξαρτώνται από την πλατφόρμα Java και των παραγώγων του [έκδοση Java του άρθρου αυτόματα συστήματος], και συνεπώς δεν μπορεί να εκφράζει τις απόψεις του παρόντος άρθρου πρακτική άποψη, το λογισμικό του συγγραφέα, το λογισμικό του συγγραφέα να χρησιμοποιήσει αυτό το άρθρο, ο συντάκτης επίσης δεν σημαίνει ότι το λογισμικό για την υποστήριξη ή αντιρρήσεις για το περιεχόμενο του άρθρου που συμμετέχουν, σε αυτό το άρθρο μόνο όπως όμως δεν περιορίζεται σε [έκδοση Java του άρθρου αυτόματα σύστημα] με τη χρήση παραδειγμάτων. 

Λογισμικό, το άρθρο αυτό ο συγγραφέας δεν φέρει καμία ευθύνες και τις υποχρεώσεις τους, αν υπάρχουν αντιρρήσεις, επικοινωνήστε με την πλατφόρμα Java παρόχου για να επικοινωνήσετε με την Oracle-Sun.


تلقائيا تنويه

المادة المذكورة أعلاه ل[جاوا نسخة من المادة تلقائيا نظام] تلقائيا ، برمجيات المؤلف إلى استخدام التكنولوجيا الموقع جافا بوت تلقائية دخول أي شخص متورط في العملية برمتها. فيها رموز وعلامات الترقيم الطريقة الصينية هي اللغة الطبيعية وتركيب برامج عشوائية ، لاستعادة وجمع من وزارة الخزانة. ولادة هذه المادة تعتمد اعتمادا كليا على منصة جافا ومشتقاته [جاوا نسخة من المادة تلقائيا نظام] ، وبالتالي لا يمكن أن تمثل آراء من هذه المادة وجهة نظر عملية البرمجيات مؤلف ، برمجيات المؤلف على استخدام هذه المادة البلاغ كما لا يعني أن البرامج لدعم أو معارضة مضمون المادة المعنية ، وهذه المادة فقط على سبيل المثال لا الحصر [جاوا نسخة من المادة تلقائيا نظام] عن طريق استخدام أمثلة على ذلك. 

البرمجيات ، وهذه المادة البلاغ لن تتحمل أية مسؤوليات والتزامات ، إن وجدت اعتراضات ، يرجى الاتصال لتوفير منصة جافا الاتصال أوراكل

___________________________________________________________________

为支持广大正义媒体的声音,抵制google恶行,减少互联网对社会的危害,鄙人自6月30日起决定自觉自愿的休网一月,博文更新也暂时停止到8月继续,特此声明。

May 18

PCM文件格式简介

再存一个~ :)

PCM文件格式简介
PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。Windows的Convert工具可以把PCM音频格式的文件转换成Microsoft的WAV格式的文件。   脉冲编码调制PCM文件格式简介


          将音频数字化,其实就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。运作原理如下。首先我们考虑声音经过麦克风,转换成一连串电压变化的信号,如图一所示。这张图的横座标为秒,纵座标为电压大小。要将这样的信号转为 PCM 格式的方法,是使用三个参数来表示声音,它们是:声道数采样位数采样频率

         采样频率即取样频率,指每秒钟取得声音样本的次数。采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级,其中,22KHz相当于普通FM广播的音质,44KHz已相当于CD音质了,目前的常用采样频率都不超过48KHz。 

        采样位数即采样值或取样值(就是将采样样本幅度量化)。它是用来衡量声音波动变化的一个参数,也可以说是声卡的分辨率。它的数值越大,分辨率也就越高,所发出声音的能力越强。
 
         声道数很好理解,有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声的pcm可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果。 
声波曲线1 声波曲线2 声波曲线3
  下面再用图解来看看采样位数和采样频率的概念。让我们来看看这几幅图。图中的黑色曲线表示的是pcm文件录制的自然界的声波,红色曲线表示的是pcm文件输出的声波,横坐标便是采样频率;纵坐标便是采样位数。这几幅图中的格子从左到右,逐渐加密,先是加大横坐标的密度,然后加大纵坐标的密度。显然,当横坐标的单位越小即两个采样时刻的间隔越小,则越有利于保持原始声音的真实情况,换句话说,采样的频率越大则音质越有保证;同理,当纵坐标的单位越小则越有利于音质的提高,即采样的位数越大越好。

          在计算机中采样位数一般有8位和16位之分,但有一点请大家注意,8位不是说把纵坐标分成8份,而是分成2的8次方即256份; 同理16位是把纵坐标分成2的16次方65536份; 而采样频率一般有11025HZ(11KHz),22050HZ(22KHz)、44100Hz(44KHz)三种。

 
样点
t1
t2
t3
t4
t5
t6
t7
...
t16
t17
t18
t19
t20
幅值
0011
0101
0111
1001
1011
1101
1110
...
0110
0110
0101
0011
0000


          那么,现在我们就可以得到pcm文件所占容量的公式:
     存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)

  例如,数字激光唱盘(CD-DA,红皮书标准)的标准采样频率为44.lkHz,采样数位为16位,立体声(2声道),可以几乎无失真地播出频率高达22kHz的声音,这也是人类所能听到的最高频率声音。激光唱盘一分钟音乐需要的存储量为:     
     (44.1*1000*l6*2)*60/8=10,584,000(字节)=10.584MBytes
这个数值就是pcm声音文件在硬盘中所占磁盘空间的存储量。

  计算机音频文件的格式决定了其声音的品质,日常生活中电话、收音机等均为模拟音频信号,即不存在采样频率和采样位数的概念,我们可以这样比较一下:
          44KHz,16BIT的声音称作:CD音质;
          22KHz、16Bit的声音效果近似于立体声(FM Stereo)广播,称作:广播音质;
          11kHz、8Bit的声音,称作:电话音质。 
          微软的WAV文件就是pcm编码的一种。


wav格式分析

wav文件格式分析详解

作者:曹京
日期:2006年7月17日
                                         

一、综述
    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个
字节便是“RIFF”。
    WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE
Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:

 

------------------------------------------------
|             RIFF WAVE Chunk                  |
|             ID  = 'RIFF'                     |
|             RiffType = 'WAVE'                |
------------------------------------------------
|             Format Chunk                     |
|             ID = 'fmt '                      |
------------------------------------------------
|             Fact Chunk(optional)             |
|             ID = 'fact'                      |
------------------------------------------------
|             Data Chunk                       |
|             ID = 'data'                      |
------------------------------------------------
            图1   Wav格式包含Chunk示例

    其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位
于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节
表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。
PS:
    所有数值表示均为低字节表示低位,高字节表示高位。

二、具体介绍
RIFF WAVE Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   'RIFF'    |
    ----------------------------------
    | Size  |  4 Bytes |             |
    ----------------------------------
    | Type  |  4 Bytes |   'WAVE'    |
    ----------------------------------
            图2  RIFF WAVE Chunk

    以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID
和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表
示是wav文件。
    结构定义如下:
 struct RIFF_HEADER
 {
  char szRiffID[4];  // 'R','I','F','F'
  DWORD dwRiffSize;
  char szRiffFormat[4]; // 'W','A','V','E'
 };

 

Format Chunk
    ====================================================================
    |               |   字节数  |              具体内容                |
    ====================================================================
    | ID            |  4 Bytes  |   'fmt '                             |
    --------------------------------------------------------------------
    | Size          |  4 Bytes  | 数值为16或18,18则最后又附加信息     |
    --------------------------------------------------------------------  ----
    | FormatTag     |  2 Bytes  | 编码方式,一般为0x0001(详见后文)     |     |
    --------------------------------------------------------------------     |
    | Channels      |  2 Bytes  | 声道数目,1--单声道;2--双声道       |     |
    --------------------------------------------------------------------     |
    | SamplesPerSec |  4 Bytes  | 采样频率                             |     |
    --------------------------------------------------------------------     |
    | AvgBytesPerSec|  4 Bytes  | 每秒所需字节数                       |     |===> WAVE_FORMAT
    --------------------------------------------------------------------     |
    | BlockAlign    |  2 Bytes  | 数据块对齐单位(每个采样需要的字节数) |     |
    --------------------------------------------------------------------     |
    | BitsPerSample |  2 Bytes  | 每个采样需要的bit数                  |     |
    --------------------------------------------------------------------     |
    |               |  2 Bytes  | 附加信息(可选,通过Size来判断有无) |     |
    --------------------------------------------------------------------  ----
                            图3  Format Chunk

    以'fmt '作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
    结构定义如下:
 struct WAVE_FORMAT
 {
  WORD wFormatTag;
  WORD wChannels;
  DWORD dwSamplesPerSec;
  DWORD dwAvgBytesPerSec;
  WORD wBlockAlign;
  WORD wBitsPerSample;
 };
 struct FMT_BLOCK
 {
  char  szFmtID[4]; // 'f','m','t',' '
  DWORD  dwFmtSize;
  WAVE_FORMAT wavFormat;
 };

补充头文件样例说明:

首先是一串“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
然后是“E4 3C 00 00”,这个是我这个WAV文件的数据大小,记住这个大小是包括头文件的一部分的,包括除了前面8个字节的所有字节,也就等于文件总字节数减去8。这是一个DWORD,我这个文件对应是15588。
然后是“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
然后是PCMWAVEFORMAT部分,可以对照一下上面的struct定义,首先就是一个WAVEFORMAT的struct。
随后是“10 00 00 00”,这是一个DWORD,对应数字16,这个对应定义中的Sizeof(PCMWAVEFORMAT),后面我们可以看到这个段内容正好是16个字节。
随后的字节是“01 00”,这是一个WORD,对应定义为编码格式“WAVE_FORMAT_PCM”,我们一般用的是这个。
随后的是“01 00”,这是一个WORD,对应数字1,表示声道数为1,这是个单声道Wav。
随后的是“22 56 00 00”,这是一个DWORD,对应数字22050,代表的是采样频率22050。
随后的是“44 AC 00 00”,这是一个DWORD,对应数字44100,代表的是每秒的数据量。
然后是“02 00”,这是一个WORD,对应数字是2,表示块对齐的内容,含义不太清楚。
然后是“10 00”,这是一个WORD,对应WAVE文件的采样大小,数值为16,采样大小为16Bits。
然后是一串“64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
而后是数据区的开头,有一个DWORD,我这里的字符是“C0 3C 00 00”,对应的十进制数为15552,看一下前面正好可以看到,文件大小是15596,其中到“data”标志出现为止的头是40个字节,再减去这个标志的4个字节正好是15552,再往后面就是真正的Wave文件的数据体了,头文件的解析就到这里。


Fact Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   'fact'    |
    ----------------------------------
    | Size  |  4 Bytes |   数值为4   |
    ----------------------------------
    | data  |  4 Bytes |             |
    ----------------------------------
            图4  Fact Chunk

    Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
    结构定义如下:
 struct FACT_BLOCK
 {
  char  szFactID[4]; // 'f','a','c','t'
  DWORD  dwFactSize;
 };

 

Data Chunk
    ==================================
    |       |所占字节数|  具体内容   |
    ==================================
    | ID    |  4 Bytes |   'data'    |
    ----------------------------------
    | Size  |  4 Bytes |             |
    ----------------------------------
    | data  |          |             |
    ----------------------------------
             图5 Data Chunk

    Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,
wav数据的bit位置可以分成以下几种形式:
    ---------------------------------------------------------------------
    |   单声道  |    取样1    |    取样2    |    取样3    |    取样4    |
    |           |--------------------------------------------------------
    |  8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |
    ---------------------------------------------------------------------
    |   双声道  |          取样1            |           取样2           |
    |           |--------------------------------------------------------
    |  8bit量化 |  声道0(左)  |  声道1(右)  |  声道0(左)  |  声道1(右)  |
    ---------------------------------------------------------------------
    |           |          取样1            |           取样2           |
    |   单声道  |--------------------------------------------------------
    | 16bit量化 |    声道0    |  声道0      |    声道0    |  声道0      |
    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
    ---------------------------------------------------------------------
    |           |                         取样1                         |
    |   双声道  |--------------------------------------------------------
    | 16bit量化 |  声道0(左)  |  声道0(左)  |  声道1(右)  |  声道1(右)  |
    |           | (低位字节)  | (高位字节)  | (低位字节)  | (高位字节)  |
    ---------------------------------------------------------------------

    ---------------------------------------------------------------------
                         图6 wav数据bit位置安排方式

    Data Chunk头结构定义如下:
    struct DATA_BLOCK
 {
  char szDataID[4]; // 'd','a','t','a'
  DWORD dwDataSize;
 };

 

FormatTag:说明

#define WAVE_FORMAT_UNKNOWN 0x0000 /* Microsoft Corporation */ 
#define WAVE_FORMAT_PCM 0x0001     /* Microsoft Corporation */ 
#define WAVE_FORMAT_ADPCM 0x0002   /* Microsoft Corporation */ 
#define WAVE_FORMAT_ALAW 0x0006    /* Microsoft Corporation */ 
#define WAVE_FORMAT_MULAW 0x0007   /* Microsoft Corporation */ 
#define WAVE_FORMAT_GSM610 0x0031  /* Microsoft Corporation */ 
#define WAVE_FORMAT_MPEG 0x0050   /* Microsoft Corporation */ 


三、小结
    因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

 

四、参考资料
    1、李敏, 声频文件格式WAVE的转换, 电脑知识与技术(学术交流), 2005.
    2、http://www.codeguru.com/cpp/g-m/multimedia/audio/article.php/c8935__1/
    3、http://www.smth.org/pc/pcshowcom.php?cid=129276

    4、http://icculus.org/SDL_sound/downloads/external_documentation/wavecomp.htm (英文详细说明)



恩,抢过来,这样就不会丢了~

May 11

我为什么常建议朋友养猫


养猫不是为了显摆,更不是单纯为了显示爱心,而有其实际效用。
所以我常建议一些朋友养猫。

养猫的效用有三:
1.怡情
2.对养孩子的预演
3.解压

因为朋友大多到了恋爱、婚嫁的年龄,所以我常建议他们先养只猫。
从几个月的幼猫开始。开始培养感情。开始朝夕相处。
开始体会那样一种家里多了一个成员多了一个小家伙儿的那种心情。
这时候它就是你或你们的孩子。
猫的IQ虽然有上限,但在情感和心理结构方面,跟小孩儿还是很像的,
那种心理规律,那种依赖、交流、爱,情感培养和教育模式,
都可以作为对养孩子的预演。

特别是年轻情侣一起养猫,不仅是恋爱生活的见证,
也能更好地体会共同的家庭生活乃至养孩子的种种甘甜辛苦和细腻微妙。

我养猫后,在怡情之外,对这些有了非常深刻、受益颇多的体会。

养一只猫,看着它从小长大,它无条件地依赖你,它的可爱与恼人,
真的让人有做爸爸妈妈的感受。

而这一切成本非常低,养猫比养狗要简单得多,养猫也比养个孩子省事儿太多了。
它自己知道危险,能跑能跳,所求并不多,不太生病,而且成长迅速。

在年轻的时候养猫,然后养孩子、养家。非常好。
有孩子后,猫还是他的伴儿,丰富他的童年、少年的生活记忆。

当然,很多时候开始养猫并没有考虑那么多,首先只是猫和人之间的一种缘分,
因为遇到,因为爱怜,所以开始养。
但猫带给人的乐趣,对人的生活、情感世界与理性的丰富,
相较于人对它的喂养和关心,绝对是超值的。
January 14

最近的几点想法

1.某些人注定是给人打工的。 2.技术和管理是两回事。 3.能跟各种各样的人沟通很重要。 4.早睡,伤口会好的快一些。 不早了,睡觉……
November 03

扯淡-很长的扯淡

大兔子病了, 
二兔子瞧, 
三兔子买药, 
四兔子熬, 
五兔子死了, 
六兔子抬, 
七兔子挖坑, 
八兔子埋, 
九兔子坐在地上哭泣来, 
十兔子问他为什么哭? 
九兔子说, 
五兔子一去不回来! 
大家看出什么门道来没?? 









































这是一件密谋杀兔事件。 



1.首先,兔子也是有阶级的,大兔子病了,要治它的病,就必须不惜一切代价,甚至牺牲一只兔子做药引。 


2.病的是大兔子,五兔子却突然死了,显然是被做成了药引。 


3."买药"其实是黑话,因为实际上只需要一些简单的草药,主要是药引,所以这个"买药"指的是去杀掉做药引的兔子,三兔子是一个杀手。 

4.做药引的为什么是五兔?因为哪只兔子适合做药引是由医生决定的,二兔子就是医生。 


5.可以推出,二兔子借刀杀兔搞死了五兔子,他们之间有什么过解呢?可能是情杀,因为一只母兔。 
6.谁是母兔呢?想一下,女人爱哭的天性,所以九兔是母兔,九兔也知道了真相,所以才哭,因为她爱的是五兔。 

7."六兔子抬",这明显是病句,一只兔子怎么抬?他显然是被抬,因为他死了,所以才会被抬。抬他的两只兔子随后一个挖坑,一个埋尸。没错,抬他来的就是七八两只兔子! 


8.六兔子是被七八两只兔子杀的吗?不是,他是被杀手三兔子杀死的。三兔子本来不想杀他,五兔子和六兔子关系非常好,当时他们正好在一起,并联手抵抗,所以三兔子才把他们一起杀了。 


大家会发现,每相临的两只兔子关系都是微妙的。1-2 大兔子像皇上,二兔子就是他身边进谗言的小人。3-4三兔子是杀手,四兔子药师,他俩都是助纣为虐型的,四兔经常给皇帝做一些壮阳药什么的,把皇上搞生病了,又亲自熬兔子药引。5-6一对好朋友,经常在一起吟诗做对,不惧怕恶势力,五兔很有才华,怪不得被九兔所爱又被二兔嫉妒呢,物以类聚,六兔也很有才,可惜都属于文人,两个人的武工加一起也没打过三兔。 7-8也是一对好朋友,但属于随风倒型的,为了保住命,什么事都肯做,本质不算坏,但经常被坏人指始做坏事。9-10在女人哭的时候,身边一定会有爱她的男人,而她的哭泣一定是为了她爱的男人。可惜,爱她的兔子和她爱的兔子不是一只兔子。很明显了吧,十兔暗恋九兔,关心她,看到她哭,他当然要去问原因。 



9.最后一点分析了,也许是多余。事情是这样的,三兔和五六两兔打斗过程中,引来了七八两兔。当五六被杀死后,三兔已没有力气,况且七八平时都很听话,不会告密的。所以三兔就放过了七八两兔,并让他们把六兔抬走,埋了。七八一看,命保住了,反正事情也发生了,无法挽回,只好照办理。 






后记1:回看第5条,情杀不是随便猜出来的,观全局,二兔位高劝重,但即便这样,也有他得不到的东西,那就是真爱。所以他杀五兔的原因很可能是这个,而且五兔正直,应该平时就经常与他作对,所以才起了杀心。 


后记2:其实五兔死的非常惨,因为二兔疯狂妒忌他,所以不想让他成为一个正常的男人。再说皇上吃了药师的药,荒淫无度,哪里最虚弱大家应该都知道吧,所谓吃什么补什么,其实五兔被做成药引的部位应该是... 



推理的补充 

(1)作为一个完整的故事,必然要有因果关系,这个故事有了果(即情杀,下面再谈),但没有因,所以显得不完整,就是大兔子为什么病了?无缘无故的病了便引发了以下的血案么?显然不是. 


(2)从一个严密的逻辑上来看,这个故事中所有人物的出现(兔子)都是有联系的,且每一个按序列排下来的兔子之间都存在因果关系(动机),比如:大兔和二兔,二兔和三兔.三兔和四兔(这个上文已经大致说明了,我就不进一步讲了),但大家有没有觉得,10兔子的出现好象在这个逻辑中显得微不足道,即没有10兔子这个故事也能顺理成章的结束,因此10兔子在这个逻辑中的动机显得苍白. 

结论: 
根据以上的推断,我们都忽视了这个故事的重点,就是10兔子,他为什么出现在这个故事中?难道仅仅为了引出9兔子的一句话么?错了,这是一个有预谋的凶杀案,而且,10兔子就是这个案件的主谋(不是2兔子),其他所有的兔子都是在他全盘计划中的一枚棋子,案发过程大致如下(补充上文): 


(1)10兔子喜欢9兔子,9兔子不喜欢他 

(2)5兔子和9兔子互相喜欢 

(3)10兔子妒忌 

(4)10兔子是大兔子身边最亲信的人,并且对其他兔子之间的关系了如指掌(也就是说,他很清楚大兔子如果病了接下来会发生些什么事),(比如10兔子就像是熬拜,大兔子是康熙) 

(5)5兔子也是朝中权贵,10兔子没办法随便处置他. 

(6)所以10兔子就让大兔子病了,接下来的一切就像上文说的那样发生了..... 


所以,贯穿整个这个故事的主线就是10兔子,他是这个故事的结尾也是这个故事的主因,这样这个逻辑才显得天衣无缝,故事的名字就是:借刀杀人
November 02

这里好慢……

似乎访问这里越来越慢了……
写东西竟然比等网页的时间还要短
而且
写完了竟然没有了???
难道
真的要逼着我把东西都存到GOOGLE上么???
September 16

编程八荣八耻...

以动手实践为荣 , 以只看不练为耻;
以打印日志为荣 , 以单步跟踪为耻;
以空格缩进为荣 , 以制表缩进为耻;
以单元测试为荣 , 以人工测试为耻;
以模块复用为荣 , 以复制粘贴为耻;
July 03

大家齐做俯卧撑

          1.给我做三下俯卧撑,我也能推动地球。——阿基米得
  
    2.如果我曾经看得远一点,是因为我比别人多做了三下俯卧撑。——牛顿
  
    3.做俯卧撑时运动速度大小,取决于你选取的参照物。——爱因斯坦
  
    4.天才就是百分之九十九的汗水加上三个俯卧撑。——爱迪生
  
    5.俯卧撑即合理。——黑格尔
  
    6.做俯卧撑还是立卧撑,这是个问题。——哈姆雷特
  
    7.俯卧撑尚未完成,同志们仍需努力。——孙中山
  
    8.我撑故我在。——笛卡尔
  
    9.俯卧撑已经做三下了,胜利还会远吗?——雪莱
  
    10.世界上本来是没有路的,做俯卧撑的人多了,也就成了路。——鲁迅
  
    11.做自己的俯卧撑,让别人说去吧!——但丁
  
    12.我有一个梦想,有这麽一天,每一个黑人都可以自由地做俯卧撑,而没有人去问他们为什么!——马丁.路德.金
  
    13.俯,我所欲也;撑,亦我所欲也!——孟子
  
    14.轻轻的我撑起来了,正如我轻轻地俯下,我挥一挥衣袖,不带走一丝尘土!——徐志摩
June 07

成为最牛程序员的五大要诀

想成为最牛程序员吗?以下几点有助你实现这个目标。

Tip 1 要方法而不是记忆

我的一个程序员朋友常跟我说记住超过200个C++函数是多么的有帮助。“我从来不必去查找函数的定义,因此我可以比其他程序员编程快上50%。”他自豪的说。可结果是什么?难道他不知道编译器的代码自动完成功能可以节约大量查找函数及输入函数的时间吗,另外当C#发布出来后,他在记忆函数上面的努力就白费了。当然,编程中对函数的熟记是一件必需的事情,但是你应当花费更多的时间在学习做事的方法上,比如说创建一个数据库连接,如何产生RSS源等,然后是关注于代码是如何实现的。学习做事的正确方法远比死记硬背重要。

Tip 2 建立属于你自己的资源库

我们都会有因为这样或者那样原因而不得不建立的代码集。我从来不记得连接数据库的准确代码语句,所以我每次都不得不在代码集中花10分钟去查询它。为了解决这个问题,我创建了一个用于记录代码片段的Word文档,以帮助我记忆和查找。我的一个朋友建了个记录链接的书签,另外一个朋友在他的邮件中存储了这些内容。无论你的方法是什么,都是一种可以使你方便查找到文件或内容的好习惯。当你建立你的知识库后,你会发现它将极大的帮助你去把代码写得更好和更快。

Tip 3 知道做什么而不是怎样做

很多初级程序员问我“我怎样做这个,或者我怎样做那个?”我总是会跟他们说“你想做什么呢?”听闻此言后,他们会死盯着我,就好像我跟他们的妈妈约会了一样。这就是我的下一个观点,绝不要在知道你想做什么之前去学习怎样做,比如一个程序员想要搜索一个文本文件中是否存在的某个特定的词汇。下面是用C#来实现该目的:

string fileContent;
System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open);
System.IO.StreamReader myStreamReader = new StreamReader(myStream); 
fileContent = myStreamReader.ReadToEnd();
myStreamReader.Close();
int idx = fileContent.
IndexOf("string"); 
if (idx)
{
return true
}

现在我给他这些代码去做这件事,但是更重要的是理解自己正在试着做的是什么。在这个例子中我们想做的是:
1. 打开一个文件
2. 读其中的内容
3. 关闭文件
4. 搜索字串
5. 如果找到了则输出结果
用这个方法来解决事情产生了以下结果:
1. 它使语言无关
2. 使你的精力集中在需要做什么上
3. 使你的代码更易读和有效
知道要做什么将使你的代码更有目的性。现在在C++、PHP、VB.NET、Ruby on Rails中编写上述代码是很容易的事情了,因为你理解了要做什么而不是怎样去做。

Tip 4 创建适合你的注释风格

每一个程序员都讨厌注释,但是为了写出更有质量和易读的代码,我们需要注释。问题是大多数程序员常被告知如何注释,一些公司希望每一行代码都有注释,另外一些则想要在每个函数前面有一段注释,还有的规定在不同的代码块前注释。我并不同意这种强制性的规定,只要代码是可用的、易读的和有效的,那么程序员应当可以用其个人喜好的格式来注释。对我来说在每一行都注释将破坏代码的节奏,我更喜欢在函数的前面注释,罗列我接下来一步步将要做什么,然后在函数中参考注释中所写的步骤进行编程。这是适合我的模式,这样可以在我编程前帮助我组织设计,也保持了我的节奏,使我不会因为需要注释而在编程时中断,也有助于其他人阅读我的代码。下面是我怎样注释的例子:

/* 1. Open File*   

2. Read file into string*   

3. Close file*   

4. Search for key word*   

5. If fond return true;  

*/  

string fileContent;   

//1.   

System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open);   

System.IO.StreamReader myStreamReader = new StreamReader(myStream);   

//2.   

fileContent = myStreamReader.ReadToEnd();   

//3.   

myStreamReader.Close();    

//4.   

int idx = fileContent.IndexOf("string");   

if (idx)   

{   

//5.   

return true;   

}  

/* 1. Open File* 
2. Read file into string* 
3. Close file* 
4. Search for key word* 
5. If fond return true;
*/
string fileContent;
//1.
System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open);
System.IO.StreamReader myStreamReader = new StreamReader(myStream);
//2.
fileContent = myStreamReader.ReadToEnd();
//3.
myStreamReader.Close(); 
//4.
int idx = fileContent.IndexOf("string");
if (idx)
{
//5.
return true;
}


这种注释风格使我和大多数程序员可以容易的阅读它。那么,找一个适合你的注释风格吧。

Tip 5 精通one,学习another,关注next

有时有程序员发email问我他应该学习什么语言,什么是最好的编程语言等等。你至少应该精通一门编程语言,可以相当好的去编写代码,然后再去学习掌握另外一门,逐渐的成长。以我自己为例,我精通C++,擅长C#,并且已经开始使用SHELL大概有一两个月了。为什么呢?精通一门语言可以使你进步,在进步中写更好的代码,找到完成任务更好的方法等。进步也是我作为一个程序员年复一年的工作,却仍没有觉得枯燥的原因。

 
鸟窝  
Photo 1 of 24

旭东 潘

Occupation
Interests
艰苦的修炼中!
Lists