体, Verdana, Arial, Helvetica, sans-serif">许多人编制多媒体播放程序总喜欢使用MediaPlayer控件,但是此控件却不能单独输出音源中的左声道右声道的内容,比如播放VCD的卡拉OK碟、左右声道为不同语言的VCD影片。为此我查阅了一些资料,发现如果用Windows API函数 MciSendString可以实现左右声道转换,并且可以很轻松的进行影片的播放、暂停、继续、停止等操作。 mciSendString函数的原型如下: MCIERROR mciSendString ( LPCTSTR lpszCommand, // 指令字符串 LPTSTR lpszReturnString, // 返回信息字符串 UINT cchReturn, // 返回信息字符串长度 HANDLE hwndCallback // 回叫窗口的句柄 ); 当我们把指令字符串设置为'Setaudio ' + AliasName + ' source to ' + Source,其中AliasName 为影片打开的别名,Source为音源输出方式(可以是'left'、'right'、'average'、'stereo',分别意为左,右,平均,立体声),这样我们就很轻松的实现了左、右、平均、立体声的转换。下面是具体函数: function AudioSource(AliasName:String; Source:String):String; var cmd:String; dwReturn:Longint; MCIReturn : array[1..128] of char; Ret: PChar; begin cmd := 'Setaudio ' + AliasName + ' source to ' + Source; dwReturn := mciSendString(pchar(cmd), nil, 0, 0); If Not (dwReturn = 0) Then begin ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128); Result := ret; Exit; End; Result := 'OK'; end; 怎么样简单吧,不过你不要小瞧了它,它是系统的一个MCI接口函数,支持绝大多数的媒体文件格式,功能十分的强大。用它绝对可以开发出一个令人眩目的多媒体程序。 下面附上一个写好的单元文件,限于篇幅,虽然里面只有几个简单的功能,但从中你可以看到mciSendString的强大功能。如果你有兴趣可以去看一下MSDN扩展扩展它的功能。我的Email:[email protected],有什么心得大家可以交流交流。WinMe,Delphi5调试通过。//media.pas unit media;interfaceuses Windows,mmsystem,SysUtils;var cmd:String; dwReturn:Longint; MCIReturn : array[1..128] of char; Ret: PChar;//打开文件 播放无窗口文件(如mp3..)时使用 function OpenMultimedia(AliasName:String;filename:String;typeDevice:String):String;overload; //播放有窗口文件(如mpg,avi,dat..)时使用 function OpenMultimedia(wnd:hwnd;AliasName:String;filename:String;typeDevice:String):String;overload; //得到短文件名 function GetShortName( sLongName : string ): string; //播放全部 function PlayMultimedia(AliasName:String):String;overload; //指定开始或结束位置播放 function PlayMultimedia(AliasName:String; form_or_to_where:String; form_bz:boolean):String;overload; //关闭指定文件 function CloseMultimedia(AliasName:String):String; //暂停播放 function PauseMultimedia(AliasName:String):String; //停止播放 function StopMultimedia(AliasName:String):String; //继续播放 function ResumeMultimedia(AliasName:String):String; //以帧格式返回媒体长度 function GetTotalframes(AliasName:String):longint; //定位到指定的帧位置并等待 function MoveMultimedia(AliasName:String; to_where:longint):String; //改变显示窗口的大小和位置 function PutMultimedia(wnd:hwnd; AliasName:String; left:longint; top:longint; Width:longint; Height:longint):String; //返回目的区域长度或宽度 function GetSize(AliasName:String; CxOrCy:String):longint; //关闭所有文件 function CloseAll():String; //设置音量 function SetVolume(AliasName:String; Volumevalue:longint):String; //设置音频输入源的声道转换 function AudioSource(AliasName:String; Source:String):String; //返回当前位置,单位为帧 function GetCurrentMultimediaPos(AliasName:String):longint;implementation//打开文件 {说明: AliasName:指定欲打开文件的别名 filename:指定欲打开文件的文件名 typeDevice:指定该文件在Windows中注册的多媒体文件名,如MPEGVideo,AVIVideo,waveaudio等, 建议使用MPEGVideo,因为其支持大多数媒体文件格式.} function OpenMultimedia(AliasName:String;filename:String;typeDevice:String):String;overload; var ShortPathAndFile : String; begin ShortPathAndfile&:=GetShortName(filename); cmd := 'open '+ShortPathAndFile+' type '+typeDevice+' Alias '+AliasName; dwReturn := mciSendString(pchar(cmd), nil, 0, 0); If Not( dwReturn = 0) Then //文件打开失败 begin Ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128);//得到错误信息 Result := ret; exit end; Result := 'ok';//文件打开成功 end;{说明: wnd:图像显示目标的句柄} function OpenMultimedia(wnd:hwnd;AliasName:String;filename:String;typeDevice:String):String;overload; var ShortPathAndFile : String; hwnds:string; Const WS_CHILD = '1073741824'; begin ShortPathAndfile&:=GetShortName(filename); str(wnd,hwnds); cmd := 'open '+ShortPathAndFile+' type '+typeDevice+' Alias '+AliasName+' parent '+hwnds+' Style '+WS_CHILD +' shareable'; dwReturn := mciSendString(pchar(cmd), nil, 0, 0); If Not( dwReturn = 0) Then //文件打开失败 begin Ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128);//得到错误信息 Result := ret; exit end; Result := 'ok';//文件打开成功 end;//得到短文件名 function GetShortName( sLongName : string ): string; var sShortName : string; nShortNameLen : integer; begin SetLength( sShortName ,MAX_PATH ); nShortNameLen :=GetShortPathName(PChar( sLongName ) ,PChar( sShortName ) ,MAX_PATH - 1 ); if( nShortNameLen = 0)then begin Result := '错误'; exit; end; SetLength( sShortName, nShortNameLen ); Result :=StrLower( pchar(sShortName)); end;//播放全部 function PlayMultimedia(AliasName:String):String;overload; begin cmd := 'play ' + AliasName dwReturn := mciSendString(pchar(cmd), nil, 0, 0);//播放 If Not (dwReturn = 0) Then //文件打开失败 begin Ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128);// 得到错误信息 Result := ret; Exit End; Result :='ok';//文件打开成功 end;//指定开始或结束位置播放 function PlayMultimedia(AliasName:String; form_or_to_where:String; form_bz:boolean):String;overload; var from_where : string; to_where : string; begin if form_bz then begin from_where := form_or_to_where; to_where := inttostr(GetTotalframes(AliasName)); end else begin from_where := '0'; to_where := form_or_to_where; end; cmd := 'play ' + AliasName + ' from ' + from_where + ' to ' + to_where; dwReturn := mciSendString(pchar(cmd), nil, 0, 0);//播放 If Not (dwReturn = 0) Then //文件打开失败 begin Ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128);// 得到错误信息 Result := ret; Exit End; Result :='ok';//文件打开成功 end;//关闭指定文件 function CloseMultimedia(AliasName:String):String; begin dwReturn := mciSendString(pchar('Close ' + AliasName), nil, 0, 0);//关闭 If Not (dwReturn = 0) Then //文件打开失败 begin Ret:=@MCIReturn; mciGetErrorString (dwReturn, ret, 128);//得到错误信息
楼上发的内容好像在一个叫SuperPlayer里见过,不知道是谁先写的这个啊?我遇到了一个小问题楼主不知道解决没?在MSDN上看到Seek的用法,上面说The seek command moves to the specified position and stopsmciSendString(pchar('seek ' + fileName + ' to ' + inttostr(position)), nil, 0, 0); 这个命令之后,停了,但是我想再让他接着这个position的位置继续播放怎么办啊? 发送那个Play命令也不行啊.请知道的兄弟帮个忙吧.
mciSendString函数的原型如下:
MCIERROR mciSendString (
LPCTSTR lpszCommand, // 指令字符串
LPTSTR lpszReturnString, // 返回信息字符串
UINT cchReturn, // 返回信息字符串长度
HANDLE hwndCallback // 回叫窗口的句柄
);
当我们把指令字符串设置为'Setaudio ' + AliasName + ' source to ' + Source,其中AliasName 为影片打开的别名,Source为音源输出方式(可以是'left'、'right'、'average'、'stereo',分别意为左,右,平均,立体声),这样我们就很轻松的实现了左、右、平均、立体声的转换。下面是具体函数:
function AudioSource(AliasName:String; Source:String):String;
var
cmd:String;
dwReturn:Longint;
MCIReturn : array[1..128] of char;
Ret: PChar;
begin
cmd := 'Setaudio ' + AliasName + ' source to ' + Source;
dwReturn := mciSendString(pchar(cmd), nil, 0, 0);
If Not (dwReturn = 0) Then
begin
ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);
Result := ret;
Exit;
End;
Result := 'OK';
end;
怎么样简单吧,不过你不要小瞧了它,它是系统的一个MCI接口函数,支持绝大多数的媒体文件格式,功能十分的强大。用它绝对可以开发出一个令人眩目的多媒体程序。
下面附上一个写好的单元文件,限于篇幅,虽然里面只有几个简单的功能,但从中你可以看到mciSendString的强大功能。如果你有兴趣可以去看一下MSDN扩展扩展它的功能。我的Email:[email protected],有什么心得大家可以交流交流。WinMe,Delphi5调试通过。//media.pas
unit media;interfaceuses
Windows,mmsystem,SysUtils;var
cmd:String;
dwReturn:Longint;
MCIReturn : array[1..128] of char;
Ret: PChar;//打开文件 播放无窗口文件(如mp3..)时使用
function OpenMultimedia(AliasName:String;filename:String;typeDevice:String):String;overload;
//播放有窗口文件(如mpg,avi,dat..)时使用
function OpenMultimedia(wnd:hwnd;AliasName:String;filename:String;typeDevice:String):String;overload;
//得到短文件名
function GetShortName( sLongName : string ): string;
//播放全部
function PlayMultimedia(AliasName:String):String;overload;
//指定开始或结束位置播放
function PlayMultimedia(AliasName:String; form_or_to_where:String; form_bz:boolean):String;overload;
//关闭指定文件
function CloseMultimedia(AliasName:String):String;
//暂停播放
function PauseMultimedia(AliasName:String):String;
//停止播放
function StopMultimedia(AliasName:String):String;
//继续播放
function ResumeMultimedia(AliasName:String):String;
//以帧格式返回媒体长度
function GetTotalframes(AliasName:String):longint;
//定位到指定的帧位置并等待
function MoveMultimedia(AliasName:String; to_where:longint):String;
//改变显示窗口的大小和位置
function PutMultimedia(wnd:hwnd; AliasName:String; left:longint; top:longint; Width:longint; Height:longint):String;
//返回目的区域长度或宽度
function GetSize(AliasName:String; CxOrCy:String):longint;
//关闭所有文件
function CloseAll():String;
//设置音量
function SetVolume(AliasName:String; Volumevalue:longint):String;
//设置音频输入源的声道转换
function AudioSource(AliasName:String; Source:String):String;
//返回当前位置,单位为帧
function GetCurrentMultimediaPos(AliasName:String):longint;implementation//打开文件
{说明:
AliasName:指定欲打开文件的别名
filename:指定欲打开文件的文件名
typeDevice:指定该文件在Windows中注册的多媒体文件名,如MPEGVideo,AVIVideo,waveaudio等,
建议使用MPEGVideo,因为其支持大多数媒体文件格式.}
function OpenMultimedia(AliasName:String;filename:String;typeDevice:String):String;overload;
var
ShortPathAndFile : String;
begin
ShortPathAndfile&:=GetShortName(filename);
cmd := 'open '+ShortPathAndFile+' type '+typeDevice+' Alias '+AliasName;
dwReturn := mciSendString(pchar(cmd), nil, 0, 0);
If Not( dwReturn = 0) Then //文件打开失败
begin
Ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);//得到错误信息
Result := ret;
exit
end;
Result := 'ok';//文件打开成功
end;{说明:
wnd:图像显示目标的句柄}
function OpenMultimedia(wnd:hwnd;AliasName:String;filename:String;typeDevice:String):String;overload;
var
ShortPathAndFile : String;
hwnds:string;
Const
WS_CHILD = '1073741824';
begin
ShortPathAndfile&:=GetShortName(filename);
str(wnd,hwnds);
cmd := 'open '+ShortPathAndFile+' type '+typeDevice+' Alias '+AliasName+' parent '+hwnds+' Style '+WS_CHILD +' shareable';
dwReturn := mciSendString(pchar(cmd), nil, 0, 0);
If Not( dwReturn = 0) Then //文件打开失败
begin
Ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);//得到错误信息
Result := ret;
exit
end;
Result := 'ok';//文件打开成功
end;//得到短文件名
function GetShortName( sLongName : string ): string;
var
sShortName : string;
nShortNameLen : integer;
begin
SetLength( sShortName ,MAX_PATH );
nShortNameLen :=GetShortPathName(PChar( sLongName ) ,PChar( sShortName ) ,MAX_PATH - 1 );
if( nShortNameLen = 0)then
begin
Result := '错误';
exit;
end;
SetLength( sShortName, nShortNameLen );
Result :=StrLower( pchar(sShortName));
end;//播放全部
function PlayMultimedia(AliasName:String):String;overload;
begin
cmd := 'play ' + AliasName
dwReturn := mciSendString(pchar(cmd), nil, 0, 0);//播放
If Not (dwReturn = 0) Then //文件打开失败
begin
Ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);// 得到错误信息
Result := ret;
Exit
End;
Result :='ok';//文件打开成功
end;//指定开始或结束位置播放
function PlayMultimedia(AliasName:String; form_or_to_where:String; form_bz:boolean):String;overload;
var
from_where : string;
to_where : string;
begin
if form_bz then
begin
from_where := form_or_to_where;
to_where := inttostr(GetTotalframes(AliasName));
end
else
begin
from_where := '0';
to_where := form_or_to_where;
end;
cmd := 'play ' + AliasName + ' from ' + from_where + ' to ' + to_where;
dwReturn := mciSendString(pchar(cmd), nil, 0, 0);//播放
If Not (dwReturn = 0) Then //文件打开失败
begin
Ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);// 得到错误信息
Result := ret;
Exit
End;
Result :='ok';//文件打开成功
end;//关闭指定文件
function CloseMultimedia(AliasName:String):String;
begin
dwReturn := mciSendString(pchar('Close ' + AliasName), nil, 0, 0);//关闭
If Not (dwReturn = 0) Then //文件打开失败
begin
Ret:=@MCIReturn;
mciGetErrorString (dwReturn, ret, 128);//得到错误信息
这个命令之后,停了,但是我想再让他接着这个position的位置继续播放怎么办啊?
发送那个Play命令也不行啊.请知道的兄弟帮个忙吧.