在 Delphi 下使用 DirectSound (7): 播放资源文件中的 Wave 数据


======================================================
注:本文源代码点此下载
======================================================

#1楼 2011-01-19 17:40 刘鹏。

万一老师,怎么播放自己加密后的视频文件呢。。。。。。

delphi2010有directx处理的相关单元,我用的是delphi2007,在importcomponent 里找到directx 8相关接口生成单元,看了感觉就像天书啊,太复杂了。。。

回复 引用 查看

#2楼[楼主] 2011-01-19 17:52 万一

@刘鹏。

关于 directx 的难度我正在体会者; 视频相关的东西还没学到.

回复 引用 查看

#3楼 2011-01-19 18:00 巅枫

@万一

谢谢老师...实在没想到老师用directsound做读取资源的例子...把我吓坏了...我先慢慢消化...呵呵

回复 引用 查看

#4楼 2011-01-19 18:04 刘鹏。

@万一

万一老师做个开路者,我们跟在后面。。。一起学习~~

回复 引用 查看

#5楼[楼主] 2011-01-19 18:19 万一

@刘鹏。

共同学习.

回复 引用 查看

#6楼[楼主] 2011-01-19 18:20 万一

@巅枫

用这个例子播放你给我的枪声很过瘾, 谢谢了.

回复 引用 查看

#7楼 2011-01-19 19:09 巅枫

@万一 要是哪天万老师再编个游戏的例子出来,那就更过瘾了…要是我能编出来…哈…我会睡不着觉的…

回复 引用 查看

#8楼 2011-01-20 13:45 巅枫

@万一

万老师,这个例子我运行出错,程序界面如下:

http://pic002.cnblogs.com/images/2011/163244/2011012013332683.png

点击第一个按钮,出错信息如下:

http://pic002.cnblogs.com/images/2011/163244/2011012013335428.png

用d2010的资源编辑器添加wav时,如下图(没有wave这个类型):

http://pic002.cnblogs.com/images/2011/163244/2011012013345884.png

我原来就是因为这个,所以才想让万老师做个简单的例子看看,没想到这个例子也出这样的错误...希望万老师能给我解惑...

测试环境:xp,d2010

回复 引用 查看

#9楼[楼主] 2011-01-20 14:05 万一

@巅枫

1、添加资源时都指定 resource type 为 wave

2、另外测试中的三个资源的标示分别是: wav_1、wav_2、wav_3

你这两步都有问题, 再仔细看看上面的图.

回复 引用 查看

#10楼 2011-01-20 14:37 巅枫

@万一

万老师,没有wave这个类型我选择,如下图:

http://pic002.cnblogs.com/images/2011/163244/2011012014321420.png

不知道老师是用记事本添加资源那种方式还是d2010资源编辑器那种方式做的资源?

回复 引用 查看

#11楼 2011-01-20 17:37 尚文雨

看他的截图,似乎是用的delphi的资源编辑器哪种加的资源,我在delphi2010里添加资源也没有找到wave这个类型.

回复 引用 查看

#12楼[楼主] 2011-01-20 17:57 万一

@尚文雨

不用找, 输入就行.

回复 引用 查看

#13楼 2011-01-20 17:57 巅枫

@尚文雨

因为为这个,我看了不少英文网站,呵呵,可是还是没搞定...不知是怎么了。。

回复 引用 查看

#14楼[楼主] 2011-01-20 18:02 万一

@巅枫

不是大问题, 只是 delphi ide 的这个资源编辑器不是很完善;

缺什么类型, 它允许输入就够了.

回复 引用 查看

#15楼 2011-01-20 19:06 巅枫

@万一

万老师,你用是delphi什么版本啊?我按你说的做了,但修改确定后它那个类型还会变回来,这两天搞的我都没心情搞其他研究了,我真是没折了,想用记事本编rc的那种方法吧,试了后没有出错,但是却播放不出声音来(wav文件没问题),不知问题出在哪里,如果可以,老师能帮我解决这个一下这个问题吗?

回复 引用 查看

#16楼[楼主] 2011-01-20 19:17 万一

@巅枫

用记事本编 rc 应该没有问题, 可能是写得不合适.

用 ide 上的这个工具, 有个注意事项(以前博文中谈过的),

建好后先保存, 重新打开后再修改, 这是 2009 就存在的问题, 不知现在好了没有.

回复 引用 查看

#17楼[楼主] 2011-01-20 19:26 万一

@巅枫

如果再不行, 我可以给你出个录像.

回复 引用 查看

#18楼 2011-01-20 19:36 巅枫

非常感谢,如果有录像那是再好不过

回复 引用 查看

#19楼 2011-01-20 19:48 巅枫

刚刚试过,保存后也是不能修改,要令万老师费心了,谢谢

回复 引用 查看

#20楼[楼主] 2011-01-20 22:44 万一

@巅枫

http://files.cnblogs.com/del/directsound_7.rar

回复 引用 查看

#21楼 2011-01-21 10:31 尚文雨

可能是版本的问题的

delphi2010中按录像上操作确实不得行,哪个类型输入也没有用,录像上的版本是xe.空闲了升级成xe试试了.

回复 引用 查看

#22楼[楼主] 2011-01-21 10:44 万一

@尚文雨

按我说的再试试:

1、先导入几个 wav, 什么也别改, 直接 ok;

2、重新打开, 再改.

我现在没装 2010, 凭印象说的.

回复 引用 查看

#23楼 2011-11-26 17:05 yehuiyan

想在dll中使用directsound,编译能通过,使用时会内存出错,还不能发声

library readwave;

uses

windows,

system.sysutils,

system.classes,

directsound,

mmsystem;

{$r *.res}

const wavpath= 'c:\temp\test.wav'; //测试用的 wave, 须保证文件存在并注意路径权限, 且只能是 pcm 格式的 wave 文件

var

mydsound: idirectsound8;

buf: idirectsoundbuffer; //缓冲区对象

dllhandle:thandle;

{从 wave 文件中获取 twaveformatex 结构的函数}

function getwavefmt(filepath: string; var fmt: twaveformatex): boolean;

var

hfile: hmmio;

ckiriff,ckifmt: tmmckinfo;

begin

result := false;

hfile := mmioopen(pchar(filepath), nil, mmio_read);

if hfile = 0 then exit;

zeromemory(@ckiriff, sizeof(tmmckinfo));

zeromemory(@ckifmt, sizeof(tmmckinfo));

zeromemory(@fmt, sizeof(twaveformatex));

ckifmt.ckid := mmiostringtofourcc('fmt', 0);

mmiodescend(hfile, @ckiriff, nil, mmio_findriff);

if (ckiriff.ckid = fourcc_riff) and

(ckiriff.fcctype = mmiostringtofourcc('wave',0)) and

(mmiodescend(hfile, @ckifmt, @ckiriff, mmio_findchunk) = mmsyserr_noerror) then

result := (mmioread(hfile, @fmt, ckifmt.cksize) = ckifmt.cksize);

mmioclose(hfile, 0);

end;

{从 wave 文件中获取波形数据的函数}

function getwavedata(filepath: string; var stream: tmemorystream): boolean;

var

hfile: hmmio;

ckiriff,ckidata: tmmckinfo;

begin

result := false;

hfile := mmioopen(pchar(filepath), nil, mmio_read);

if hfile = 0 then exit;

zeromemory(@ckiriff, sizeof(tmmckinfo));//zeromemory要window单元的支持

zeromemory(@ckidata, sizeof(tmmckinfo));

ckidata.ckid := mmiostringtofourcc('data', 0);

mmiodescend(hfile, @ckiriff, nil, mmio_findriff);

if (ckiriff.ckid = fourcc_riff) and

(ckiriff.fcctype = mmiostringtofourcc('wave',0)) and

(mmiodescend(hfile, @ckidata, @ckiriff, mmio_findchunk) = mmsyserr_noerror) then

begin

stream.size := ckidata.cksize;

result := (mmioread(hfile, stream.memory, ckidata.cksize) = ckidata.cksize);

end;

mmioclose(hfile, 0);

end;

function cformcreate: boolean; stdcall;

begin

system.reportmemoryleaksonshutdown := true; //让程序自动报告内存泄露

end;

function cb1: boolean; stdcall;

var

bufdesc: tdsbufferdesc;//建立缓冲区需要的结构

wavformat: twaveformatex; //从 wave 中提取的结构

wavdata: tmemorystream;//从 wave 中提取的波形数据

p1: pointer;//从缓冲区获取的写指针

n1: dword;//要写入缓冲区的数据大小

begin

{从 wave 文件中读取格式与波形数据}

if not getwavefmt(wavpath, wavformat) then exit;

wavdata := tmemorystream.create;

if not getwavedata(wavpath, wavdata) then begin wavdata.free; exit; end;

{建立设备对象, 并设置写作优先级}

dllhandle:=getmodulehandle('keyboarhook.dll'); //取得dll自己的句柄

directsoundcreate8(nil, mydsound, nil);

mydsound.setcooperativelevel(dllhandle, dsscl_normal);

{填充建立缓冲区需要的结构}

zeromemory(@bufdesc, sizeof(tdsbufferdesc));

bufdesc.dwsize := sizeof(tdsbufferdesc);

bufdesc.dwflags := dsbcaps_static;//指定使用静态缓冲区

bufdesc.dwbufferbytes := wavdata.size; //数据大小

bufdesc.lpwfxformat := @wavformat;//数据格式

//bufdesc.guid3dalgorithm := ds3dalg_default; //这个暂不需要

{建立缓冲区}

mydsound.createsoundbuffer(bufdesc, buf, nil);

{锁定缓冲区内存以获取写入地址和写入大小}

buf.lock(0, 0, @p1, @n1, nil, nil, dsblock_entirebuffer);

{写入}

wavdata.position := 0;

copymemory(p1, wavdata.memory, n1);

wavdata.free;

{解锁}

buf.unlock(p1, n1, nil, 0);

{播放}

buf.play(0, 0, 0);

end;

function cb2: boolean; stdcall;

begin

buf.play(0, 0, dsbplay_looping);

end;

function cb3: boolean; stdcall;

begin

buf.stop;

end;

function cb4: boolean; stdcall;

begin

buf := nil;

mydsound := nil;

end;

exports cformcreate,cb1,cb2,cb3,cb4;

begin

end.

回复 引用 查看

注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页

首页博问闪存新闻园子招聘知识库

最新it新闻:

·ios 5.1 beta3文件预示未来 siri有可能支持 ipad和 ipod touch

·android平台12月广告浏览份额51.6% 超越ios

·测试版ios源代码显示ipad 3或将支持siri

·斯蒂芬·霍金的新电脑

·京东商城2.95亿竞得北京商业地一块

» 更多新闻...

最新知识库文章:

·javascript 面向对象编程

·持续集成之“everything is code”

·持续集成之“软件自我识别”

·持续集成之戏说check-in dance

·什么是闭包。
       我的理解

» 更多知识库文章...

china-pub 2011秋季教材巡展

china-pub 计算机绝版图书按需印刷服务

copyright ©2012 万一 powered by: 博客园 模板提供:沪江博客


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值