老问题:声道控制!300分!(300分)

  • 主题发起人 主题发起人 【小高】
  • 开始时间 开始时间

【小高】

Unregistered / Unconfirmed
GUEST, unregistred user!
老问题:
我想用DSPACK实现多媒体播放(DVD,VCD,MPEG4),但不知道如何控制声道!

如果用MEDIA PLAY +MCI控制VCD我已经知道了,MPEG4与DVD不知道如何控制???

还有呀WMV格式的文件能不能有方法控制声道呢???

谢谢!
 
楼上的大哥,可以说一下这些播放器的开发流程吗?
 
我只知道DVD的声轨选择方法,其他的未试过。

FilterGraph: TFilterGraph;

procedure TForm.AudioSel(Num: Word);
//Num -- 声轨的编号
var
DVDControl: IDVDControl;
begin

if FilterGraph.Active then

begin

if Succeeded(FilterGraph.QueryInterface(IID_IDVDControl, DVDControl)) then

begin

DVDControl.AudioStreamChange(Num);
end;

end;

DVDControl := Nil;
end;
 
我想MEDIA PLAY + MCI 大概主要其实是对声音设备的声道进行控制,
而不是对媒体内媒体流的控制。
 
我见过一本书上有一个方法,等五一过后,我把其原代码帖出来
 
刚刚搜索到一些资料,跟我在那本书上看到的差不多,不知你需不需要。转帖如下:
控制音量要用到waveOutSetVlume函数,此函数的声明在MMSystem.h单元中。
此单放在Delphi目录下的Source/rtl/win中

主意这儿用到两个函数waveOutSetVlume和waveOutGetVolume,不要用混,
我第一次用它们时就给搞混了,好费事。

程序如下:

三个TrackBar的属性设置:Max:=255;Frequency:=16;

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, mmsystem;

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

//音量控制
procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin

// if a=0 then
Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
waveOutSetVolume(0,v);
end;


//左声道控制
procedure TForm1.TrackBar2Change(Sender: TObject);
var
t,v:Longint;
begin

t:=TrackBar2.Position;
waveOutGetVolume(0,@v);
v:=v and $ffff0000 or (t shl 8);
waveOutSetVolume(0,v);
end;


//右声道控制
procedure TForm1.TrackBar3Change(Sender: TObject);
var
t,v:Longint;
begin

t:=TrackBar3.Position;
waveOutGetVolume(0,@v);
v:=v and $0000ffff or (t shl 24);
waveOutSetVolume(0,v);
end;


//获得当前音量值
procedure TForm1.FormCreate(Sender: TObject);
var
v:longint;
begin

waveOutGetVolume(0,@v);
TrackBar2.Position:=hi(v);
TrackBar3.Position:=hi(v shr 16);
if hi(v)>hi(v shr 16) then

TrackBar1.Position:=hi(v)
else

TrackBar1.Position:=hi(v shr 16);
end;


end.



函数说明:

waveOutSetVolume
第一个参数是波形文件输出设备标识符;
第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
高16位表示右声道的音量。

waveOutGetVolume
第一个参数是波形文件输出设备标识符;
第二个参数是一个32位整数的指针。
==============================================================
这里有一些供你参考:
uses MMSystem;

waveOutGetVolume(0,X) //获得当前音量值;
waveOutSetVolumn(0,X) //设置当前音量值;
第一个参数是波形文件输出设备标识符;
第二个参娄是音量大小。这是一个32位的整数,
低16位表示左声道的音量,
高16位表示右声道的音量。
 
每天都要问声道的问题,先搜吧,一打一打的
 
DVD的声道控制?是左右声道,还是原声,伴唱呀,DVD可是5.1声道呀,你要控制哪些?
 
[red]DSPACK实现多媒体播放(DVD,VCD,MPEG4),但不知道如何控制声道![/red]
 
你到说清楚点,到底要求控制声道达到什么效果?
声音大小?
左右声道切换?
还是什么?
 
to IamWLJ888,
我的本意是想知道如何控制其原声,伴唱 也就是卡拉OK的效果
 
3cs,我查了离线包查到了你的不少贴子,高手!

还有IamWLJ888,

如果可能,能在里加我不呢??

我QQ是66814872

我现在在做VOD系统,大家多多指教呀!
 
DVD声道很多,关注!
 
VCD的声道控制,你可用MCI来做嘛
至于MPEG4的声道也可参考VCD声道控制来做,我还没试过,MPEG4通常只有一条音轨,解码
为MP3或AC3,有时也有两音轨混合的,具体方法不祥。不过有专门的播放软件。
DVD的声音部分,通常解码为多声道的AC3或DTS,可有2条以上的不同配音声轨
DVD的卡拉OK碟,通常为其中一条声轨含多声道的原唱,而其中另一条声轨为不含原唱的多
声道伴音,你可以选择哪一条声轨的播放达到切换原唱与伴音的效果。
4月30日的回复就是利用DirectShow来选择DVD声轨的播放,你可以试试嘛。
 
至于MCI控制声道的方法,想必你也很清楚了,这里就不作解释了。
 
我觉得你用DS完成它较好些。

DVD: 找一个MPGE2的解码器,然后用GraphEdit分析一下这个解码器的声道情况你就明白了
解码器网上一大堆,自己找吧.
VCD:不用找MPEG1解码器,MS支持这种格式。你用DS不会做的话,可以查查以前高手们的
贴子,里面有的。
MPEG4:这种格式,大部都没有“伴唱”。如果想做它,你就要自己去压歌曲或者加一个
MP3,AC3的“伴唱”音轨。
 
谢谢上面的朋友们,,我按你们的方法试验一下了,现在忙死了,没时间试,

过阵子就来结这个帐!!!

 
什么文件格式并不重要,重要的是你要达什么目标,如果你想实现卡拉OK功能,
最好是用MPEG1和MPEG2格式的文件,这样比较省力些,当然如果有能力有时间
可以做做RM,ASF的多音轨的合成工作,一旦成功我相信你的“钱途无限”,至
少在娱乐行业你的视频源会很倡销。哈哈,不多说了,祝你好运!
 

Similar threads

D
回复
0
查看
824
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部