付现金!!求DirectShow实现Karaok效果(100分)

  • 主题发起人 主题发起人 luket
  • 开始时间 开始时间
L

luket

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,原来是贴在国外网站的:
hi:
MTV file format is MPG,it have two channels,is Karaoke music,I converted the MTV file into a MPEG4 file
Video Compressor filter:Div-X MPEG-4(Fast-Motion)
Audio Compressor filter:MPEG Layer-3.

how control the MPEG4 file's channels?how control all format media as VCD,MPEG4,DVD's channels?i want karaok!!
I will write a program todo
it with Dspack in delphi or DirectShow in vc,any idea?

if you cando
it pls contact me,i can pay cash!!!

thanx!!very much!!

Email:luketang@21cn.com

总之,即用DirectShow播放VCD,MPEG4,DVD时实现伴音/原唱效果。
能提供建议的均给分。
能给出详细编程方法的请联系我,可以给现金报酬,或者转帐!!!
 
下面的网站有你要的控件,也有例子!
www.progdigy.com
 
谢谢zhihuali你得分了。
我不知道Dspack的具体编程实现方法。你能告诉我吗?
据我所知,要实现卡拉OK效果,MPEG4格式最难。
 
他有例子啊,而且他也支持 MPEG4格式的。
 
例子我全看过,没有实现卡拉OK效果的编程控制方法。
 
以前好像SONY公司有一块
集成电路芯片
6248
好像是这个号码?
使用它可以很容易的实现,我印刷线路板都做好了,可是跑遍整个常熟和苏州都没有买到它。

但是我知道他的原理是

因为人的声音在左右声道是相同的,而音乐在左右声道是不同的
所以只要分析一下,去掉左右相同时间的相同内容就出来了只有音乐没有歌声的伴奏了
 
给你一个提示,用 DIRECTSHOW 的分层功能,也就是第一层显示影片图象,第二层显示
你自己加进去的文字,也就是象 POWERDVD 、 WINDVD 等用的 DVD 字幕显示技术。
 
to zhihuali:
你这么熟,能在QQ上请教你吗?
我的:4713167
你的呢?

to 栋栋:
谢谢,那是VCD的方法。
MPEG4大部分的格式是DivX4+mp3,所以实现karaok很难.
 
以前用MCI可以实现VCD的消音方法。
但用DirectShow不知怎么实现?

DVD在DirectShow SDK中也有介绍,但没实现过。

最难的是MPEG4,毫无头绪。
 
播放的部分做过,不过没有测试过卡拉OK的部分
 
to caowei:
thanks!
能上QQ聊聊吗?我的:4713167
你的呢?
 
我很少用QQ的,呵呵...我是拨号上网的,哪能那么自由啊?
...
你可以从http://www.avsuper.com/chs/vod.zip下载演示程序,
实现的是MPEG1和4的VOD. MPEG4的你把后缀名写成AVI就可以了.
MPEG1的就用MPG或者DAT.
需要源程序的时候和我联系: avsuper@avsuper.com
 
我试了,网络播放器是可以的,我是用DShow写的吗?
但我做的只需要是单机版的卡拉OK机
假如你有实现卡拉OK的程序,我愿意购买
 
to caowei:
你这个的源程序可以发给我看看吗?
 
Direct X是微软公司提供给游戏编写人员的一套应用程序编程接口(APIs),它为编写高效、实时的应用程序提供了有力的支持。因此,有必要将这个接口封装到Delphi的组件库中。Direct X SDK是面向Visual C/C++和Watcom C/C++的,因而使用Object Pascal直接存取Direct X SDK,将带来诸多不便。但我们可先在VC下将Direct X接口封装成动态链接库,然后在Delphi下通过该动态链接库去存取Direct X。

  本文介绍用Delphi封装Direct Sound的方法,这种方法同样也可以应用到Direct Draw(但建议不要使用独占模式,否则会带来不少问题)。

  先简单介绍一下Direct Sound的接口界面。Direct Sound的基本对象有两个,即IDirectDraw和IDirectDrawBuffer。前者代表声卡,后者代表声音数据缓冲区。

  IDirectDraw是整个Direct Sound的基础,其建立方法如下:

  LPDIRECTSOUND lpDS;


  HRESULT ErrorCode;


  HWND hwnd=Mainhwnd;//窗口句柄

  ErrorCode=DirectSoundCreate(NULL, &lpDS, NULL);
//建立对象

  if(ErrorCode!=DS_OK)return FALSE;
//失败则返回

   ErrorCode=lpDS->SetCooperativeLevel(hwnd, DSSCL_NORMAL);//设置存取模式

  if(ErrorCode!=DS_OK) //失败则返回

  {

   lpDS->Release();


   lpDS=NULL;


   return FALSE;


  }

  IDirectDrawBuffer通过IDirectDraw建立。IDirectDrawBuffer有两种基本类型,一种被称作“基本缓冲区”(Primary Buffer), 另一种被称作“辅助缓冲区”(Secondary Buffer)。 基本缓冲区是Direct Sound 混音的基础,一般不直接存取这个缓冲区(虽然也可以),但可以通过该缓冲区去存取初始化声卡,方法如下:

  HRESULT ErrorCode;


  LPDIRECTSOUND lpDS=lpMainDS;//Direct Sound对象

  LPDIRECTSOUNDBUFFER lpDBP;


  DSBUFFERDESC dsbds;


  ZeroMemory(&dsbds,sizeof(dsbds));


  dsbds.dwSize=sizeof(dsbds);


  dsbds.dwFlags=DSBCAPS_PRIMARYBUFFER;


  ErrorCode=lpDS->CreateSoundBuffer(&dsbds,&lpDBP,NULL);//建立基本缓冲区

  if(ErrorCode!=DS_OK)return FALSE;//失败则返回

   ErrorCode=lpDBP->Play(0,0,DSBPLAY_LOOPING);//初始化

  if(ErrorCode!=DS_OK)//失败则返回

  {

   lpDBP->Release();


   lpDBP=NULL;


   lpDS->Release();


   lpDS=NULL;


   return FALSE;


  }

  lpDBP->Release();//释放基本缓冲区

  return TRUE;
//初始化成功

  辅助缓冲区可以建立任意多个,声音数据就放在这种缓冲区内,每个缓冲区可被独立播放(IDirectSoundBuffer::Play),Direct Sound会处理这些声音并实现混音的效果。其建立方法与基本缓冲区的差不多,只是对DSBUFFERDESC的填写有些不一样:

  ZeroMemory(&dsbufferdesc,sizeof(dsbufferdesc));


  dsbufferdesc.dwSize=sizeof(dsbufferdesc);


  dsbufferdesc.dwFlags=DSBCAPS_STATIC|DSBCAPS_CTRLDEFAULT;


  dsbufferdesc.dwBufferBytes=BufferSize;//缓冲区大小

  dsbufferdesc.lpwfxFormat=(LPWAVEFORMATEX)&pcmformat;//wav文件的PCM格式

  ErrorCode=lpDS->CreateSoundBuffer(&dsbd,&lpSB,NULL);


  建立该缓冲区后,通过IDirectSoundBuffer::Lock锁定内存即可写入数据。数据可以用普通MCI的多媒体函数读取,由于篇幅所限,这里不再详述,读者可以参考Win32 SDK手册和Direct X SDK的联机帮助。值得注意的是,Direct Sound的缓冲区是循环的,Lock返回两个指针,数据必须分成两部分写入。

  数据进入DirectSoundBuffer后,就可以调用IDirectSoundBuffer的声音控制方法来控制声音的播放、停止、频率、声道等特性。但要注意的是:因为Win95是多任务的,设备有可能被别的程序占用,所以IDirectSoundBuffer的功能调用可能会引发DSERR_BUFFERLOST错误。此时,如果要确保你的请求一定会得到响应,则必须调用IDirectSoundBuffer::Restore以重新获得设备。

  掌握了这些基本概念后,就可以在C++中编写Direct Sound的控制程序了,但Delphi无法直接存取上面提及的数据结构。为了解决这个问题,我们可以定义一个数组,分别代表不同的辅助缓冲区,Dephi通过该数组的索引来使用多个缓冲区。因此,我们的DLL中至少包括以下的接口函数:

  CreateDSoundInterface(HWND hwnd)//初始化

  LoadWave(int index, char *filename)//装入wav数据

  Play(int Index) //播放

  Stop(int Index)//停止

  Clear(int Index)//释放缓冲区

  当然,还可以加入其它控制,例如对频率、声道等的控制。

  有了动态链接库后,在Delphi中编写混音器组件的方法就比较简单了,与其它组件基本上没什么区别。

  首先,新建一个组件(New Component),设定其祖先类型为TComponent。然后,编写相应的方法初始化设备,实现DLL中提供的功能。这里只作两点说明:

  1、不要在继承的Create函数中加载DLL和初始化设备。不在构造方法中初始化设备是明智的做法,因为这样做较安全。

  2、因为DLL是用C编写的,所以接口函数说明必须是C的调用标准,例如可以像下面这个样子:

  Var

   DllFunction :

  function(Parametre : ParaType) : RusultType;
cdecl;


  ......

  LibraryHandle=LoadLibrary('DllFile.dll');


  ......

  @DllFunction:=GetProcAddress(LibHandle,'DllFunction_Name');


  组件单元编好以后,可通过选择Component|Install Component菜单来将组件装入Delphi的组件库即可使用它。

 
mixerGetID 获取指定混频器的标识符
mixerGetLineContrils 检取和一个声频线路相关的一个或多个控件
mixerGetLineInfo 检取混频器有关特有线路的信息
mixerGetNumDevs 返回系统中存在的混频器的数量
mixerMessage 把一个定制混频器驱动器消息直接发送给混频
器驱动器
mixerOpen 打开指定的混频器,在应用程序关闭该句柄前
保证该设备不被移走
mixerSetControlDetails 设置和一个声频指线路相关的单一控件的细节
 
DivX4俺看过几小时 你的需求比较苛求
可惜俺最近没有精力搞了
有兴趣可以推荐点参考。。
http://www.Doom9.org
http://divx.ctw.cc

Downloads

Package Date Version
DirectShow Source 2001-04-25 0.3 (Core 4.0 a 50)
Binaries 2001-04-25 0.3 (Core 4.0 a 50)
Install File (*.exe) 2001-04-25 0.3 (Core 4.0 a 50)
Video For Windows dll Source 2001-04-25 0.3 (Core 4.0 a 50)

DirectShow Source Uh, the source necessary to compile the DirectShow filter.
Binaries Here we have divx.dll (the codec), divxdec.ax (the DirectShow decoder filter), OpenDivx.inf and instructions.
Install File (*.exe) This is all you need if you just want to install the OpenDivX codec, which includes the divx.dll and DirectShow filter.
Video For Windows dll Source Source necessary to compile divx.dll.
Latest "DivX For Windows" snapshots: The source code is automatically zipped up nightly for those whodo
n't want to deal withdo
wnloading the code from CVS.
 
TO zhihuali:
其实有VC的代码
有了这些混频器后,接下来呢?
请注意,我是用DirectShow,而不是用DirectX

 
TO zhihuali:
其实有VC的代码更好

有人建议我用DirectShow的Filter,对Mp3 Decoder Filter输出的声音建一个Filter,自己处理,然后输出到DirectSound Device Filter
不知这种方法是否可行?
假如可行,有人能提供示范源代码吗?

TO 房客:
谢谢!
 
>>以前用MCI可以实现VCD的消音方法。
>>但用DirectShow不知怎么实现?
DirectShow 不可能实现消音方法的,这是多媒体显示的东西,跟声音没有关系!
你要用的是 DirectSound 和 DirectMusic 等东西!

 

Similar threads

I
回复
0
查看
2K
import
I
I
回复
0
查看
3K
import
I
I
回复
0
查看
3K
import
I
I
回复
0
查看
1K
import
I
后退
顶部