MCISendString()在delphi7中怎么用啊,急!在线等!

解决方案 »

  1.   

    体, 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);//得到错误信息
      

  2.   

    楼上发的内容好像在一个叫SuperPlayer里见过,不知道是谁先写的这个啊?我遇到了一个小问题楼主不知道解决没?在MSDN上看到Seek的用法,上面说The seek command moves to the specified position and stopsmciSendString(pchar('seek ' + fileName + ' to ' + inttostr(position)),  nil, 0, 0);
    这个命令之后,停了,但是我想再让他接着这个position的位置继续播放怎么办啊?
    发送那个Play命令也不行啊.请知道的兄弟帮个忙吧.