文档章节

操作 Wave 文件(2): 判断一个文件是否是 Wave 文件

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 693
阅读 2
收藏 0
点赞 0
评论 0

Wave 文件的前 12 个字节可以这样描述:
TRiff = record
  ckId    : DWORD; {'RIFF'}
  ckSize  : DWORD; {文件大小, 不包括前 8 个字节}
  fccType : DWORD; {'WAVE'}
end;

 
 
 
 
 

 

 

  

我们读出文件的前 12 个字节进行判断, 就基本可以确认它是不是 Wave 文件.

uses MMSystem, IOUtils; {这里准备用 IOUtils.TFile.OpenRead 方便地建立文件流}

procedure TForm1.FormCreate(Sender: TObject);
var
  riff: record ckId, ckSize, fccType: DWORD; end; {可以同时定义结构并声明结构变量}
begin
  with TFile.OpenRead('C:\WINDOWS\Media\Windows XP 启动.wav') do
  begin
    Read(riff, SizeOf(riff));
    Free;
  end;

  if (riff.ckId = FOURCC_RIFF) and (riff.fccType = mmioStringToFOURCC('WAVE',0)) then
    ShowMessageFmt('这是个 Wave 文件, 其大小是 %d 字节', [riff.ckSize + 8]);
end;

 
 
 
 
 

 

 

  

还是把它写成一个函数吧, 最好也别再引用 MMSystem 单元.

{如果是 Wave 文件则返回文件大小, 不是则返回 0}
function IsWave(FilePath: string): Integer;
  function mmioFOURCC(Chr0,Chr1,Chr2,Chr3: AnsiChar): DWORD;
  begin
    Result := DWORD(Chr0) + DWORD(Chr1) shl 8 + DWORD(Chr2) shl 16 + DWORD(Chr3) shl 24;
  end;
var
  riff: record ckId, ckSize, fccType: DWORD; end;
begin
  Result := 0;
  with TFileStream.Create(FilePath, fmOpenRead) do begin
    Read(riff, SizeOf(riff));
    Free;
  end;
  if (riff.ckId = mmioFOURCC('R', 'I', 'F', 'F')) and
     (riff.fccType = mmioFOURCC('W', 'A', 'V', 'E')) then
    Result := riff.ckSize + 8;
end;

 
 
 
 
 

 

 

  

依次道理, 也可以判断一个 RIFF 文件具体是什么格式.

{返回 RIFF 文件格式的函数, 如果不是 RIFF 文件, 则返回 'noneRIFF'}
function GetRiffType(FilePath: string): String;
  function mmioFOURCC(Chr0,Chr1,Chr2,Chr3: AnsiChar): DWORD;
  begin
    Result := DWORD(Chr0) + DWORD(Chr1) shl 8 + DWORD(Chr2) shl 16 + DWORD(Chr3) shl 24;
  end;
var
  riff: record ckId, ckSize, fccType: DWORD; end;
type
  TChars = array[0..3] of AnsiChar; {用于类型转换}
begin
  Result := 'noneRIFF';
  with TFileStream.Create(FilePath, fmOpenRead) do begin
    Read(riff, SizeOf(riff));
    Free;
  end;
  if (riff.ckId = mmioFOURCC('R', 'I', 'F', 'F')) then Result := TChars(riff.fccType);
end;

//测试:
begin
  ShowMessage(GetRiffType('C:\WINDOWS\Media\Windows XP 启动.wav')); {WAVE}
  ShowMessage(GetRiffType('C:\WINDOWS\clock.avi'));                 {AVI }
  ShowMessage(GetRiffType('C:\WINDOWS\notepad.exe'));               {noneRIFF}
end;

 
 
 
 
 

 

 

  

关于 FOURCC_RIFF、mmioFOURCC、mmioStringToFOURCC:

RIFF 格式的文件都是有若干 "块" 来构成的, 每个块都是有 4 个字符开头(不足4个字符用空格补足);
这连续的 4 个字节刚好是一个 32 位整数的大小, 所以常常把它们当作一个整数读出来判断.

通过 MMSystem.mmioStringToFOURCC 就可以获取这样的整数.

从 C/C++ 代码中经常看到: mmioFOURCC; 它并非 winmm.dll 库中的函数, 是在 C/C++ 中定义的宏.
这里用 Delphi 模拟实现了这个函数. 其功能类似 mmioStringToFOURCC.

MMSystem.FOURCC_RIFF 是个常量, 当需要 "RIFF" 对应的整数时直接用就是了. 举例:

uses MMSystem;

{自定义的 mmioFOURCC 函数}
function mmioFOURCC(Chr0,Chr1,Chr2,Chr3: AnsiChar): DWORD;
begin
  Result := DWORD(Chr0) + DWORD(Chr1) shl 8 + DWORD(Chr2) shl 16 + DWORD(Chr3) shl 24;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  f1,f2,f3,f4: FOURCC; {FOURCC = DWORD;}
begin
  f1 := mmioStringToFOURCC('RIFF', 0);
  f2 := mmioStringToFOURCC('Riff', MMIO_TOUPPER); {第二个参数可以把字符串转大写}

  f3 := mmioFOURCC('R', 'I', 'F', 'F');

  f4 := FOURCC_RIFF;

  ShowMessageFmt('%d, %d, %d, %d', [f1,f2,f3,f4]);
  {1179011410, 1179011410, 1179011410, 1179011410}
end;

 
 
 
 
 

 

 

  

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

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
【wav音频解析】之wavread函数的C++实现

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

刘小米 ⋅ 2014/09/29 ⋅ 7

语音编码的WAVE文件头格式剖析

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

长平狐 ⋅ 2012/10/09 ⋅ 0

pcm 转化为wav 文件

pcm是纯粹的音频数据文件,缺少对录制音频时的参数的描述,主要参数包括 通道数量 采样率,每秒采样多少次 每个采样的占用多少字节 wav是加上头和pcm 数据,构成一个可以播放的格式 wav头:参...

李勇2 ⋅ 2016/08/25 ⋅ 0

Apache 基金会让Google Wave 重生?

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

小卒过河 ⋅ 2011/10/11 ⋅ 7

请问fread(c)读取wave文件(二进制)中间 莫名中断的原因!

struct wav_struct{ .... unsigned long subchunk2size; //wave数据长度(字节) short *data;(数据是两个字节 一个采样点) } int main { ... fp = fopen("C:/Users/Administrator/Deskto......

小青蛇 ⋅ 2015/03/21 ⋅ 0

视音频数据处理入门:PCM音频采样数据处理

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

leixiaohua1020 ⋅ 2016/01/29 ⋅ 0

Jspeex转换出来的wav音频不被standing wave识别,无法播放

环境:JDK 1.7, Flex 4, Win7/8/8.1 前提:手机端的语音压缩用的是Speex。并把文件用Base64转码了。 公司项目需求:在Flex平台接收来自手机端发来的语音并播放。 项目结构:前台Flex,后台J...

bravehlp ⋅ 2014/07/29 ⋅ 1

VC调用matlab函数mclcppMlfFeval重复定义

问题背景: 用mcc -W cpplib:libname -T link:lib -v matlabmfile.m 编译.m文件,生成vc可用的动态连接库和.h头文件,相关数据.c文件,和一个.cpp文件(mtocpp.cpp),该.cpp文件中.h文件提供...

长平狐 ⋅ 2012/10/08 ⋅ 0

第一财经周刊:谷歌冲浪(Google Wave)

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

老枪 ⋅ 2009/10/21 ⋅ 1

pcDuino控制z-wave门锁

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

酸酸苹果汁 ⋅ 2014/01/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 58分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部