yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
阅读:1909回复:9

谁能告诉我怎样改变声音播放速度

楼主#
更多 发布于:2002-04-16 21:58
我想要控制声卡播放声音的速度
谁能告诉我怎样改变声音播放速度?
或告诉我的思路也行
先感谢了!!!






-----yangyang
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
Snake
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-17 08:45
MMRESULT waveOutGetPlaybackRate(
  HWAVEOUT hwo,    
  LPDWORD pdwRate  
);
 
Parameters
hwo
Handle of the waveform-audio output device.
pdwRate
Address of a variable to be filled with the current playback rate. The playback rate setting is a multiplier indicating the current change in playback rate from the original authored setting. The playback rate multiplier must be a positive value.
The rate is specified as a fixed-point value. The high-order word of the variable contains the signed integer part of the number, and the low-order word contains the fractional part. A value of 0x8000 in the low-order word represents one-half, and 0x4000 represents one-quarter. For example, the value 0x00010000 specifies a multiplier of 1.0 (no playback rate change), and a value of 0x000F8000 specifies a multiplier of 15.5.

Return Values
Returns MMSYSERR_NOERROR if successful or an error otherwise. Possible error values include the following:

Value Description
MMSYSERR_INVALHANDLE Specified device handle is invalid.
MMSYSERR_NODRIVER No device driver is present.
MMSYSERR_NOMEM Unable to allocate or lock memory.
MMSYSERR_NOTSUPPORTED Function isn\'t supported.
Snake
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-18 10:30
    不知你要如何改变播放速度?我搞过一段时间的音频录放,压缩
用的是 waveI/O,acm接口.
    改变播放速度,可以用上面提到的那个函数,但前提是你的声卡
要支持该功能.否则要自己在软件里通过处理回放数据实现这一效果.
    不知这是不是你需要的,如是的话可以发一份源码给你,在回放
的回调函数中对回放数据作点处理就可以了.
yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-18 19:54
十分感激您Snake!!
我的声卡是CMI8738的芯片,我想自己编程控制声卡播放声音的速度.我搞了很久,但就是没有结果,我感到很烦恼.
我真诚盼望您寄给我一份源码,作为参考!!!!!!!!!!!
我再次表示非常非常的感谢!!!!




--------------------------
yangyang


[编辑 -  4/19/02 作者: yangyang]
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-20 00:48
我受到你的源码后真不知怎样感谢您!!!!!
不过你的程序好像有点问题!!!
打开*.wav文件后什么反映都没有!!!
能否告诉我???????????????????????
谢谢了!!!!!!!!!!!!!!!!!!
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
Snake
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-20 19:06
     能播放的文件是用Mp3压缩过得,看看我给你的源码有没有
这个L3codeca.acm文件,有的话把它copy到 \\debug,或windwos\\system目录下。
     没有的话,周一我上班再发给你。
播放的回调函数是:
void CALLBACK CRec::waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
其中:
pThis->pPlayMp3->mp3Conver(pWaveData,LenSrc,pCMP3Data,&DL);
是解压缩。
pThis->pPlayWaveIO->WriteAudioOutBuffer(pCMP3Data,DL);
是播放解出的数据。数据指针为pCMP3Data,长度为DL,
在播放前修改,处理数据就可以实现你要求的效果了。



yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-20 19:25
谢谢您Snake
   我收到您的源码后!!!里面有错误文件。可能是压缩错误。
希望您能从新压。
  我遇到问题是不能录音,本播放*.wav问文件无反映。
  如果我想把声音加快后减慢,应该修该什么地方?
 谢谢你对我的帮助!!!!!

 
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-21 13:05
    能播放的文件是用Mp3压缩过得,看看我给你的源码有没有
这个L3codeca.acm文件,有的话把它copy到 \\debug,或windwos\\system目录下。
     没有的话,周一我上班再发给你。
播放的回调函数是:
void CALLBACK CRec::waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
其中:
pThis->pPlayMp3->mp3Conver(pWaveData,LenSrc,pCMP3Data,&DL);
是解压缩。
pThis->pPlayWaveIO->WriteAudioOutBuffer(pCMP3Data,DL);
是播放解出的数据。数据指针为pCMP3Data,长度为DL,
在播放前修改,处理数据就可以实现你要求的效果了。



 



我照你的做了,但是我不熟悉,没成功,能否再驾劳你指点以下或更详细一点。好吗?
拜托了
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
Snake
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-22 10:40
    修改播放的原始数据可以产生你需要的任何效果,至于具体的
算法,我也没搞过,请你自行查阅相关资料.
    如果你仅是要快慢放,告诉你一个简单的方法,改这个地方:
pPlayWfxDst=(LPWAVEFORMATEX)malloc(pPlayMp3->GetwfxDstSize());
pPlayMp3->Getwfx(pPlayWfxDst);
mRState.PlayDstDataLen=pPlayMp3->GetCDataLen();

pPlayWfxDst->nSamplesPerSec =18000;

if(!pPlayWaveIO->StartOut((DWORD)waveOutProc,pPlayWfxDst, mRState.PlayDstDataLen*2))
 {
  StopPlay();
  return 3;


pPlayWfxDst->nSamplesPerSec =*****; 是后加的,在我给你的例子
中,录制的采样频率是22050,你通过强制改变回放的频率可以改变
回放速度,****=11025就是慢一倍的速度回放,xxxx=44100就是快一倍
的速度回放.速度快慢由****的值决定,xxxx可在44100~8000左右任选


 }
yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-22 13:14
谢谢您!Snake
 我就是想改变声音的速度。我回去试一下。如果不行还得向您请教

对了,如果您有什么困难而不能解决,不要忘了我。也许帮得着。
谢谢!!!!!!!!!!!!!
 :) :) :) :) :) :) :) :) :) :) :) :) :) :)
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
游客

返回顶部