各位大侠,能在代码里直接实现播放画面吗?

解决方案 »

  1.   

    起码要用控件,不然就直接调用windows的播放器Media Player
      

  2.   

    应该是可以播放的。用DirectShow试试吧。
      

  3.   

    你去下个DSPack装上吧。里面有例子的。照着里面的例子改一改就可以了。
      

  4.   

    emughost() : 能否详细说明一下?到哪里去下载?我是业余的,谢谢!
      我用delphi7中的组件windowsmeidaplayer(system中),filename选路径,autoopen选true,运行时报错;"无法通过给定的扩展名确定设备类型",怎么才能使用这个组件?
      

  5.   

    emughost()你也做directshow吗,
    有什么经验说一下吧,我也初学。
      

  6.   

    http://www.delphifans.com/可以下载到DSPack.
    我是对这方面感兴趣,自学了一点点而以。
    如果是初学,DSPack已经能够满足很多需要了。
    如果要深入进去的话,必须把接口和COM相关的学习一下。还要多看看DXSDK。
    我现在最多只能用用Filter。很想开发自已的Filter,但能力不够。
      

  7.   

    最好不要用WMP控件来开发,太不灵活了。
    用DirectShow,再装个完整点的音视频解码包,99%的媒体文件都可以播放了。
      

  8.   

    用DirectShow 吧....这有个例子(转):
    unit Main;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      DirectShow, ExtCtrls, Buttons, ActiveX;
     
    const
      WM_GraphNotify = WM_App+1;
     
    type
      TMainForm = class(TForm)
        DisplayPanel: TPanel;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        SpeedButton3: TSpeedButton;
        SpeedButton4: TSpeedButton;
        SpeedButton5: TSpeedButton;
        SpeedButton6: TSpeedButton;
        SpeedButton7: TSpeedButton;
        Image1: TImage;
        OpenDialog: TOpenDialog;
        procedure SpeedButton1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure DisplayPanelResize(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure SpeedButton5Click(Sender: TObject);
        procedure SpeedButton6Click(Sender: TObject);
        procedure SpeedButton7Click(Sender: TObject);
      private
        { Private declarations }
      protected
        procedure WMGraphNotify(var Msg: TMessage); message WM_GraphNotify;
      public
        { Public declarations }
        GraphBuilder: IGraphBuilder;
        VideoWindow: IVideoWindow;
        MediaControl: IMediaControl;
        MediaEvent: IMediaEventEx;
        MediaSeek: IMediaSeeking;
        SampleGrabber: ISampleGrabber;
     
        procedure GraphDestory;
        procedure OpenFile(const FileName: string);
        procedure Play;
        procedure Next;
        procedure Prev;
        procedure Fast;
        procedure Slow;
        procedure SnapShot;
      end;
     
    var
      MainForm: TMainForm;
     
    implementation
     
    uses
      ComObj;
     
    {$R *.DFM}
     
    procedure TMainForm.SpeedButton1Click(Sender: TObject);
    begin
      if OpenDialog.Execute then
      begin
        GraphDestory;
        OpenFile(OpenDialog.FileName)
      end
    end;
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      CoInitialize(nil)
    end;
     
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      GraphDestory;
     
      CoUninitialize
    end;
     
    procedure TMainForm.OpenFile(const FileName: string);
    var
      PFileName: array [0..255] of WideChar;
      Filter: IBaseFilter;
      MediaType: TAM_MEDIA_TYPE;
      Intf: IInterface;
    begin
      GraphDestory;
      
      GraphBuilder:=CreateComObject(CLSID_FilterGraph) as IGraphBuilder;
     
      Filter:=CreateComObject(CLSID_SampleGrabber) as IBaseFilter;
      Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);
      GraphBuilder.AddFilter(Filter, 'Grabber');
      Filter:=nil;
      ZeroMemory(@MediaType, SizeOf(TAM_MEDIA_TYPE));
      MediaType.majortype:=MEDIATYPE_Video;
      MediaType.subtype:=MEDIASUBTYPE_RGB24;
      MediaType.formattype:=FORMAT_VideoInfo;
      SampleGrabber.SetMediaType(MediaType);
      SampleGrabber.SetBufferSamples(True);
     
      StringToWideChar(FileName, PFileName, 255);
      GraphBuilder.RenderFile(PFileName, nil);
     
      GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
      VideoWindow.put_Owner(DisplayPanel.Handle);
      VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
      VideoWindow.put_Visible(True);
      DisplayPanelResize(nil);
     
      GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeek);
      MediaSeek.SetTimeFormat(Time_Format_Frame);
     
      GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
     
      GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEvent);
      MediaEvent.SetNotifyWindow(Handle, WM_GraphNotify, 0);
    end;
     
    procedure TMainForm.GraphDestory;
    begin
      if VideoWindow<>nil then
      begin
        VideoWindow.put_Visible(False);
        VideoWindow.put_Owner(0)
      end;
      VideoWindow:=nil;
     
      MediaControl:=nil;
     
      MediaEvent:=nil;
     
      GraphBuilder:=nil
    end;
     
    procedure TMainForm.DisplayPanelResize(Sender: TObject);
    begin
      if VideoWindow<>nil then
        VideoWindow.SetWindowPosition(0, 0, DisplayPanel.Width, DisplayPanel.Height)
    end;
     
    procedure TMainForm.SpeedButton2Click(Sender: TObject);
    begin
      Play
    end;
     
    procedure TMainForm.WMGraphNotify(var Msg: TMessage);
    var
      EventCode: Integer;
      Param1, Param2: Integer;
      CurrentPosition, EndPosition: Int64;
    begin
      if MediaEvent<>nil then
      begin
        while MediaEvent.GetEvent(EventCode, Param1, Param2, 0)=S_OK do
        begin
          MediaEvent.FreeEventParams(EventCode, Param1, Param2);
          if EventCode=EC_Complete then
          begin
            if MediaControl<>nil then
              MediaControl.Stop;
            if MediaSeek<>nil then
            begin
              CurrentPosition:=0;
              MediaSeek.SetPositions(CurrentPosition,
                AM_SEEKING_AbsolutePositioning,
                EndPosition, AM_SEEKING_NoPositioning)
            end
          end
        end
      end
    end;
     
    procedure TMainForm.SpeedButton3Click(Sender: TObject);
    begin
      Next
    end;
     
    procedure TMainForm.SpeedButton4Click(Sender: TObject);
    begin
      Prev
    end;
     
    procedure TMainForm.SpeedButton5Click(Sender: TObject);
    begin
      Fast
    end;
     
    procedure TMainForm.SpeedButton6Click(Sender: TObject);
    begin
      Slow
    end;
     
    procedure TMainForm.SpeedButton7Click(Sender: TObject);
    begin
      SnapShot
    end;
     
    procedure TMainForm.Play;
    begin
      if MediaControl<>nil then
        MediaControl.Run
    end;
     
    procedure TMainForm.Next;
    var
      CurrentPosition, EndPosition: Int64;
    begin
      if MediaControl<>nil then
        MediaControl.Pause;
      if MediaSeek<>nil then
      begin
        MediaSeek.GetPositions(CurrentPosition, EndPosition);
        Inc(CurrentPosition);
        MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
          EndPosition, AM_SEEKING_NoPositioning)
      end
    end;
     
    procedure TMainForm.Prev;
    var
      CurrentPosition, EndPosition: Int64;
    begin
      if MediaControl<>nil then
        MediaControl.Pause;
      if MediaSeek<>nil then
      begin
        MediaSeek.GetPositions(CurrentPosition, EndPosition);
        Dec(CurrentPosition);
        MediaSeek.SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
          EndPosition, AM_SEEKING_NoPositioning)
      end
    end;
     
    procedure TMainForm.Fast;
    begin
      if MediaSeek<>nil then
        MediaSeek.SetRate(2)
    end;
     
    procedure TMainForm.Slow;
    begin
      if MediaSeek<>nil then
        MediaSeek.SetRate(0.125)
    end;
     
    procedure TMainForm.SnapShot;
    var
      MediaType: TAM_MEDIA_TYPE;
      VideoInfoHeader: TVideoInfoHeader;
      BitmapInfo: TBitmapInfo;
      Bitmap: HBitmap;
      Buffer: Pointer;
      BufferSize: Integer;
    begin
      SampleGrabber.GetConnectedMediaType(MediaType);
     
      ZeroMemory(@VideoInfoHeader, SizeOf(TVideoInfoHeader));
      CopyMemory(@VideoInfoHeader, MediaType.pbFormat, SizeOf(VideoInfoHeader));
     
      ZeroMemory(@BitmapInfo, SizeOf(TBitmapInfo));
      CopyMemory(@BitmapInfo, @VideoInfoHeader.bmiHeader, SizeOf(VideoInfoHeader.bmiHeader));
     
      Bitmap:=CreateDIBSection(0, BitmapInfo, DIB_RGB_COLORS, Buffer, 0, 0);
      SampleGrabber.GetCurrentBuffer(BufferSize, Buffer);
     
      Image1.Picture.Bitmap.Handle:=Bitmap
    end;
     
    end.