文档章节

操作 Wave 文件(7): 建立一个空的 Wave 文件(三种方法)

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 518
阅读 5
收藏 0
点赞 0
评论 0

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses MMSystem;

//chan: 1 单声道、2 立体声;
//freq: 频率, 取值: 11025, 22050, 44100
//bit : 每个样本的大小, 取值 8、16
function CreateWav1(chan, freq, bit: Word; const FilePath: string): Boolean;
var
  h: HMMIO;
  ckiRiff, ckiFmt, ckiData: TMMCKInfo;
  fmt: TPCMWaveFormat;
begin
  //此函数是使用 mmioCreateChunk 函数来分别建立 Wave 文件的每个块.

  {初识化相关结构}
  ZeroMemory(@ckiRiff, SizeOf(TMMCKInfo));
  ckiRiff.cksize := 36; {mmioCreateChunk 函数会自动写上 ckid, 但其 cksize 需要手动给}
  ckiRiff.fccType := mmioStringToFOURCC('WAVE', 0);

  ZeroMemory(@ckiFmt, SizeOf(TMMCKInfo));
  ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);

  ZeroMemory(@ckiData, SizeOf(TMMCKInfo));
  ckiData.ckid := mmioStringToFOURCC('data', 0);

  {指定 Wave 格式}
  fmt.wf.wFormatTag := WAVE_FORMAT_PCM;
  fmt.wf.nChannels := chan;
  fmt.wf.nSamplesPerSec := freq;
  fmt.wf.nAvgBytesPerSec := freq * chan * bit div 8;
  fmt.wf.nBlockAlign := chan * bit div 8;
  fmt.wBitsPerSample := bit;

  h := mmioOpen(PChar(FilePath), nil, MMIO_CREATE or MMIO_WRITE);
  if h = 0 then Exit(False);

  {分别建立 RIFF、fmt、data 块}
  if (mmioCreateChunk(h, @ckiRiff, MMIO_CREATERIFF) = MMSYSERR_NOERROR) and
    (mmioCreateChunk(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and
    (mmioWrite(h, PAnsiChar(@fmt), SizeOf(TPCMWaveFormat)) = SizeOf(TPCMWaveFormat)) and
    (mmioAscend(h, @ckiFmt, 0) = MMSYSERR_NOERROR) and
    (mmioCreateChunk(h, @ckiData, 0) = MMSYSERR_NOERROR) then Result := True;

  mmioClose(h, 0);
end;

//把 PCM 编码的 WAVE 文件的前 44 个字节看成一个结构来操作:
function CreateWav2(chan, freq, bit: Word; const FilePath: string): Boolean;
type
  TWaveHeader = record
    Riff_ckid      : DWORD;
    Riff_cksize    : DWORD;
    Riff_fccType   : DWORD;
    fmt_ckid       : DWORD;
    fmt_cksize     : DWORD;
    wFormatTag     : Word;
    nChannels      : Word;
    nSamplesPerSec : DWORD;
    nAvgBytesPerSec: DWORD;
    nBlockAlign    : Word;
    wBitsPerSample : Word;
    data_ckid      : DWORD;
    data_cksize    : DWORD;
  end;
var
  wh: TWaveHeader;
  hFile: Integer;
begin
  wh.Riff_ckid := FOURCC_RIFF;
  wh.Riff_cksize := 36;
  wh.Riff_fccType := mmioStringToFOURCC('WAVE', 0);
  wh.fmt_ckid := mmioStringToFOURCC('fmt', 0);
  wh.fmt_cksize := 16;
  wh.wFormatTag := WAVE_FORMAT_PCM;
  wh.nChannels := chan;
  wh.nSamplesPerSec := freq;
  wh.nAvgBytesPerSec := freq * chan * bit div 8;
  wh.nBlockAlign := chan * bit div 8;
  wh.wBitsPerSample := bit;
  wh.data_ckid := mmioStringToFOURCC('data', 0);
  wh.data_cksize := 0;

  hFile := FileCreate(FilePath);
  Result := (FileWrite(hFile, wh, SizeOf(TWaveHeader)) <> -1);
  FileClose(hFile);
end;

//同上, 只是改用流来写文件
function CreateWav3(chan, freq, bit: Word; const FilePath: string): Boolean;
type
  TWaveHeader = record
    Riff_ckid      : DWORD;
    Riff_cksize    : DWORD;
    Riff_fccType   : DWORD;
    fmt_ckid       : DWORD;
    fmt_cksize     : DWORD;
    wFormatTag     : Word;
    nChannels      : Word;
    nSamplesPerSec : DWORD;
    nAvgBytesPerSec: DWORD;
    nBlockAlign    : Word;
    wBitsPerSample : Word;
    data_ckid      : DWORD;
    data_cksize    : DWORD;
  end;
var
  wh: TWaveHeader;
begin
  wh.Riff_ckid := FOURCC_RIFF;
  wh.Riff_cksize := 36;
  wh.Riff_fccType := mmioStringToFOURCC('WAVE', 0);
  wh.fmt_ckid := mmioStringToFOURCC('fmt', 0);
  wh.fmt_cksize := 16;
  wh.wFormatTag := WAVE_FORMAT_PCM;
  wh.nChannels := chan;
  wh.nSamplesPerSec := freq;
  wh.nAvgBytesPerSec := freq * chan * bit div 8;
  wh.nBlockAlign := chan * bit div 8;
  wh.wBitsPerSample := bit;
  wh.data_ckid := mmioStringToFOURCC('data', 0);
  wh.data_cksize := 0;

  with TFileStream.Create(FilePath, fmCreate) do begin
    Result := (Write(wh, SizeOf(TWaveHeader)) = SizeOf(TWaveHeader));
    Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateWav1(1, 11025, 8,  'C:\Temp\X1.wav');
  CreateWav2(2, 22050, 16, 'C:\Temp\X2.wav');
  CreateWav3(2, 44100, 16, 'C:\Temp\X3.wav');
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/11/10/1599435.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
进阶音效控制与管理(转载)

摘要 以 XNA 为基础的游戏程序可以利用 SoundEffect 类别的功能执行简单的音效播放,或是利用 SoundEffectInstance 类别进行进阶的音效播放控制,包括播放、暂停、恢复、结束、是否要播放 3D...

junwong
2012/02/17
476
0
【wav音频解析】之wavread函数的C++实现

本文由三部分组成,第一部分背景介绍 —— 音频类型及本文动机,第二部分类比matlab下wavread()函数的作用,第三部分则给出该函数的C++实现。 一 背景介绍 1.1 本文动机 1)所有wav音频处理的...

刘小米
2014/09/29
0
7
Google Wave 拓展推出 刺激第三方应用开发

谷歌在3月12日启动了Google Wave的拓展,又向有着第三方应用贡献的开源、实时协作平台迈进了一步。 新拓展包括Trip app Trippy;Mind Map,来让用户创建可视化工作流;Waffle,一个时间管理工...

老枪
2010/03/14
567
0
Apache 基金会让Google Wave 重生?

北京时间11月25日消息,据国外媒体报道,谷歌于今年8月宣布关闭在线实时沟通协作服务 Google Wave。但开源项目Apache软件基金会日前宣布将推出一款类似于Google Wave的服务,在其开源软件Apa...

小卒过河
2011/10/11
1K
7
使用waveOut接口在Windows中播放声音

使用waveOut接口在Windows中播放声音 转贴地址:http://wmnmtm.blog.163.com/blog/static/382457142011101314135546/ ####################### //声明: 1 本帖作者是:加菲 ,至此感谢! 2 ...

ll124884135
2012/05/29
0
0
视音频数据处理入门:PCM音频采样数据处理

===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB、YUV像素数据处理 视音频数据处理入门:PCM音频采样数据处理 视音频数据处理...

leixiaohua1020
2016/01/29
0
0
语音编码的WAVE文件头格式剖析

WAVE文件头作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。合理利用WAVE文件头可...

长平狐
2012/10/09
119
0
pcDuino控制z-wave门锁

说到z-wave不得不提到一个热门话题,那就是智能家居。为何z-wave在智能家居方面占据了强势地位呢?这主要基于Z-Wave的属性。Z-Wave是一种新兴的基于射频的、低成本、低功耗、高可靠、适于网络...

酸酸苹果汁
2014/01/06
387
0
第一财经周刊:谷歌冲浪(Google Wave)

Google期望Wave能变革人们在互联网上的沟通方式,不过,这要看大众是否能适应这种新形式。 文|CBN记者 徐涛 Wave是什么?Google的新玩意儿! 每过一段时间,这家以创新和不羁著称的公司都要...

老枪
2009/10/21
463
1
python数据建模分析 - 语音识别

语音识别: Getting Started!首先,我们要知道语音的产生过程 voice.png 状态:由肺产生向外的气流,完全放松时声带张开,就是平时的呼吸。如果声带一张一合(振动)形成周期性的脉冲气流。这个...

语落心生
2017/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部