请教MCI的问题 :关闭视频与音频 及控制声道(200分)

  • 主题发起人 主题发起人 cheka
  • 开始时间 开始时间
C

cheka

Unregistered / Unconfirmed
GUEST, unregistred user!
如下两个过程,

procedure TForm1.Button9Click(Sender: TObject);
var lpSet:PMCI_Set_Parms;
begin

mciSendCommand (MediaPlayer1.DeviceID ,
MCI_SET ,MCI_SET_VIDEO And MCI_SET_OFF
And MCI_NOTIFY And MCI_WAIT ,
dword(lpSet)
);
end;


// 此过程欲关闭 所放VCD的视频

procedure TForm1.Button3Click(Sender: TObject);
var lpSetAudio:PMCI_Set_Parms;
begin

lpSetAudio.dwAudio:=MCI_SET_AUDIO_ALL;
mciSendCommand (MediaPlayer1.DeviceID ,
MCI_SET ,
MCI_SET_AUDIO and MCI_SET_Off
And MCI_NOTIFY And MCI_WAIT ,
dword(lpSetAudio)
);
end;


// 此过程欲关闭所放VCD的所有声道音频

两个过程执行后均无反应,也没有报错,原以为是MediaPlayer的
DeviceID与MCI命令中的DeviceID不兼容,但是试用以下两个函数

MCISendCommand(MediaPlayer1.DeviceID,
MCI_PLAY,
0,
DWORD(lpPlay));

mciSendCommand(MediaPlayer1.DeviceID,
MCI_PAUSE,
0,
DWORD(lpPause));
能够获得开始播放和暂停的效果。

<h2>请教 前两个过程(关闭视频与音频)执行无效的原因。</h2>

另外,很多MCI的数据类型 Delphi里都没有
 
你怎么全部用了 and (位与),
要用 or (位或)连起来才对呀
 
你怎么全部用了 and (位与),
要用 or (位或)连起来才对呀


这么简单的错误,嘿嘿是否200分归我?
 
Pipi 等一下,我要是试出来了立刻给分,绝不食言。:-)
 
TO Pipi

不行啊,我试了全用or,不成功,
MCI_SET_VIDEO And MCI_SET_OFF or MCI_NOTIFY or MCI_WAIT :不成功
MCI_SET_VIDEO or MCI_SET_OFF : 还是不成功


 
反正 and 是肯定不行的 (01 and 10)=00 (01 or 10)=11
or 也不行我就不知道啦
 
谢谢Pipi,虽然用了or还是不行,不过我用And确实是蠢透了。
这个问题好像被人问过了不少遍,为什么到现在都没解决方法呢,
唉。
 
我试了你的,有不对的地方
var lpSet:PMCI_Set_Parms
lpSet指向有效内存了吗?

我是这样用的:

var s: MCI_Set_Parms //这里不要 P

下面是 DWORD(@s) //@s 是指向 s 有效内存的指针

成功
 
to Pipi

这个我也注意到了,后用
var lpSet:TMCI_Set_Parms;
begin

lpSet.dwAudio:=MCI_SET_AUDIO_ALL;
lpSet.dwCallback :=MediaPlayer1.Handle;
MediaPlayer1.Wait:=true;
mciSendCommand (MediaPlayer1.DeviceID ,MCI_SET ,mci_Set_Door_Open
or MCI_NOTIFY,
Longint(@lpSet)
);

里面调用指针的方式是跟TMediaPlayer的源码学的,还是没用;
换了你的(其实应该是一样的),也没有成功。

请问你成功的是哪个功能? 最好把代码帖出来,要是能行的话,
两百分里我给你170,另外再开100分,如何?
 
我放的是avi(因为我y2k加班,这里找不到mpg),不知道是否有什么不同?
另外除了 MCI_SET 消息外,还有个 MCI_SETVIDEO 和 MCI_SETAUDIO
(不用MCI_SET)直接设置视频、音频,不知道有没有用?

代码就用你上面的,和我说的,运行以后画面停了,不再刷新,
函数返回代码是0。

你检查返回值了吗?如果不为0,看看 mciGetErrorString 是什么错误?

procedure TForm2.aa;
var
s:MCI_Set_Parms;
begin

if(mciSendCommand (MediaPlayer1.DeviceID , MCI_SET , MCI_SET_VIDEO or MCI_SET_OFF or MCI_NOTIFY or MCI_WAIT , integer(@s) )=0)then

ShowMessage('ok')
else

ShowMessage('err');
end;

 
成功了:

回到家一试,mpg果然不支持 MCI_SET ,但是支持 MCI_SETVIDEO 命令

const
MCI_SETVIDEO=$0876;
//注意和上面的 MCI_SET_VIDEO 不是同一个东西
//这个命令值delphi 没有,我是从bcb找到的
procedure TForm1.Button3Click(Sender: TObject);
var
s: MCI_SET_PARMS
err:integer;
buf:array[0..1000] of char;
begin

err:=mciSendCommand(MediaPlayer1.DeviceID,MCI_SETVIDEO, MCI_SET_OFF or MCI_NOTIFY or MCI_WAIT,DWORD(@s));
if(err=0)then

ShowMessage('ok')
else

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;

end;


当使用 MCI_SET 命令时 mciGetErrorString 转换得到的错误信息是“不支持的命令”,
用MCI_SETVIDEO 命令就成功了,返回0,画面停止了。
估计声音用 MCI_SETAUDIO 设置,该值为 $0873,你可以试试
 
可能和mci驱动程序也有关的,不同的mpg的mci驱动程序可能有的支持这个,有的支持那个命令。

我用的是 xing 带来的 驱动程序
 
:(

AVI和Mpeg确实不一样,

FError:=mciSendCommand(....);
mciGetErrorString(FError, ErrMsg, SizeOf(ErrMsg));
show(ErrMsg);

用AVI显示
命令执行完毕 (达到效果)

换了Mpeg,显示:
MMSYSTEM274 当前使用的MCI设备不支持指定命令

另外 Delphi里根本没有定义 MCI_SETVIDEO 和 MCI_SETAUDIO

有点搞不懂了,我用
FFlags := mci_Wait or mci_GetDevCaps_Item;
FError:=mciSendCommand(MediaPlayer1.DeviceID ,
MCI_GETDEVCAPS,
mci_Wait or mci_GetDevCaps_Item,
DWORD(@CapsParms)
);
得到Avi和Mpeg时的设备类型,都是520,由于Delphi里没有定义
设备类型的常量,只能去VC5的include目录里找mmsystem.h察看
,520是代表MCI_DEVTYPE_DIGITAL_VIDEO

照理说相同的设备类型的话不会在对某个命令的支持上产生分歧
吧,可就是产生了。

Delphi的确还有不少地方需要改进,比如有那么多的常量和数据
结构它竟然不愿意定义,还有所附的 MCI SDK帮助实在是够呛,
各种参数及常量的排列层次极乱:
比如 MCI_GETDEVCAPS_ITEM 和 mci_GetDevCaps_Device_Type 在
帮助里是同一个层次的。只有对着mmsystem.pas看才发现它们并非
平起平坐。

 
我用的也是Xing
在VC5下的mmsystem.h中怎么也没找到Set_Video和Set_Audio :-(

谢谢Pipi, 不过还剩下一个问题,就是我可以用
lpSet.dwAudio:=MCI_SET_AUDIO_ALL;
然后开启和关闭两个声道
可是用
lpSet.dwAudio:=MCI_SET_AUDIO_Right 或
lpSet.dwAudio:=MCI_SET_AUDIO_Left
却不能控制单独声道 ,效果与MCI_SET_AUDIO_ALL一样。

这个问题单独开100 ,再次请教了。
 
后退
顶部