type MCI_DGV_SETAUDIO_PARMS=record dwCallback:DWORD; dwItem:DWORD; dwValue:DWORD; dwOver:DWORD; lpstrAlgorithm:PChar; lpstrQuality:PChar; end ; procedure sdchange; var s: MCI_DGV_SETAUDIO_PARMS ; begin //mediaplayer1 为控件NAME mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO,MCI_SET_OFF,integer(@s)); s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_STEREO; //立体声用这句 // s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_LEFT; //右声道源 // s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_RIGHT; //右声道源 s.dwItem:=MCI_DGV_SETAUDIO_SOURCE; mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM ,integer(@s)); mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_SET_ON,integer(@s)); end;2、使用directShow切换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;3、用MCI切换左右声道 procedure TMainFrm.MySetAudio(Value:byte); var SetAs,retstr:string; begin case Value of 1: begin mcisendstring('set all audio all on',nil,0,handle); SetAs:='stereo'; n7.Checked :=true; if FrmDisplayScr.visible then FrmDisplayScr.n7.Checked :=true; lbSoundLR.Caption :='立体声'; end; 2: begin mcisendstring('set all audio all on',nil,0,handle); SetAs:='left' ; n8.Checked :=true; if FrmDisplayScr.visible then FrmDisplayScr.n8.Checked :=true; lbSoundLR.Caption :='左声道'; end; 3: begin mcisendstring('set all audio all on',nil,0,handle); SetAs:='right'; n9.checked :=true; if FrmDisplayScr.visible then FrmDisplayScr.n9.Checked :=true; lbSoundLR.Caption :='右声道'; end ; 4: begin mcisendstring('set all audio all on',nil,0,handle); SetAs:='average'; lbSoundLR.Caption :='平均'; end; 5: begin lbSoundLR.Caption :='静音'; mcisendstring('set all audio all off',nil,0,handle); n10.Checked :=true; if FrmDisplayScr.Visible then FrmDisplayScr.n10.Checked :=true; exit; end; end; if fileopened then begin retstr:= AudioSource(MediaAliasName,SetAs ); if retstr<>'ok' then showinformation(retstr); end; end;另外我有一已写成的dll,可用于播放VCD、wmv、asf等,但不支持DVD。如果需要请留下email
http://community.csdn.net/Expert/TopicView.asp?id=3075640
这里有一段代码,我用VB试过了但不行。不知是代码错还是我的设置错。请高手指点。
MciSendString "setaudio 设备名 source to left",uu,len(uu),0
MciSendString "setaudio 设备名 source to right",uu,len(uu),0
MciSendString "setaudio 设备名 source to stereo",uu,len(uu),0
MciSendString命令只能实现对MCI播放的影片声音输出进行调整,但如果是用MSDXM.OCX控件播放的话则无能为力.请教有没有更好的方法?
你可以对你使用的控件观察一下,它是否使用了相关的API,比如MciSendString、MciSendCommand、MciEx...
如果它使用的是MciSendString播放的媒体,那么你只用找到他的媒体设备名称便可通过API进行操作了,这种操作甚至可以在不同的进程进行。至于观察控件是否使用的方法可以直接打开OCX文件,因为OCX文件在编译时声明的API名称不会编译的。
试过用MCI切换双声道的MP3文件吗?成功了再说。
1、在程序中自己捕获送到声卡缓冲区的音频数据,然后用一个声道的数据填充另一声道。
2、使用api切换声道
3、使用media player控件后面两种方法我没试过,但曾看到过有关的资料。我自己的程序是用第一种方法实现的,具体是通过directshow插入一个自己编写的filter到播放链中,然后实时用一个声道的数据填充另一声道。
uses mmsystem;const
MCI_SETAUDIO= $873;
MCI_DGV_SETAUDIO_SOURCE_LEFT=1;
MCI_DGV_SETAUDIO_SOURCE_STEREO=0;
MCI_DGV_SETAUDIO_SOURCE_RIGHT=2;
MCI_DGV_SETAUDIO_SOURCE=$4004;
MCI_DGV_SETAUDIO_VALUE=$01000000;
MCI_DGV_SETAUDIO_ITEM=$00800000;
type MCI_DGV_SETAUDIO_PARMS=record
dwCallback:DWORD;
dwItem:DWORD;
dwValue:DWORD;
dwOver:DWORD;
lpstrAlgorithm:PChar;
lpstrQuality:PChar;
end ;
procedure sdchange;
var
s: MCI_DGV_SETAUDIO_PARMS ;
begin
//mediaplayer1 为控件NAME
mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO,MCI_SET_OFF,integer(@s));
s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_STEREO; //立体声用这句
// s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_LEFT; //右声道源
// s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_RIGHT; //右声道源
s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM ,integer(@s));
mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_SET_ON,integer(@s));
end;2、使用directShow切换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;3、用MCI切换左右声道
procedure TMainFrm.MySetAudio(Value:byte);
var SetAs,retstr:string;
begin
case Value of
1: begin
mcisendstring('set all audio all on',nil,0,handle);
SetAs:='stereo'; n7.Checked :=true;
if FrmDisplayScr.visible then
FrmDisplayScr.n7.Checked :=true;
lbSoundLR.Caption :='立体声';
end;
2: begin
mcisendstring('set all audio all on',nil,0,handle);
SetAs:='left' ; n8.Checked :=true;
if FrmDisplayScr.visible then
FrmDisplayScr.n8.Checked :=true;
lbSoundLR.Caption :='左声道';
end;
3: begin
mcisendstring('set all audio all on',nil,0,handle);
SetAs:='right'; n9.checked :=true;
if FrmDisplayScr.visible then
FrmDisplayScr.n9.Checked :=true;
lbSoundLR.Caption :='右声道';
end ;
4: begin
mcisendstring('set all audio all on',nil,0,handle);
SetAs:='average';
lbSoundLR.Caption :='平均';
end;
5: begin
lbSoundLR.Caption :='静音';
mcisendstring('set all audio all off',nil,0,handle);
n10.Checked :=true;
if FrmDisplayScr.Visible then
FrmDisplayScr.n10.Checked :=true;
exit;
end;
end; if fileopened then
begin
retstr:= AudioSource(MediaAliasName,SetAs );
if retstr<>'ok' then
showinformation(retstr);
end;
end;另外我有一已写成的dll,可用于播放VCD、wmv、asf等,但不支持DVD。如果需要请留下email