Unit1.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. {$IFDEF VER150}
  4.   {$WARN UNSAFE_CODE OFF}
  5.   {$WARN UNSAFE_TYPE OFF}
  6.   {$WARN UNSAFE_CAST OFF}
  7. {$ENDIF}
  8. uses
  9.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DSPack,
  10.   Menus, ExtCtrls, ComCtrls, StdCtrls,directshow9, OleServer, DSUtil,
  11.   ImgList, ToolWin, shellapi;
  12. type
  13.   TFormDVDPlayer = class(TForm)
  14.     MainMenu: TMainMenu;
  15.     FileMenu: TMenuItem;
  16.     OpenMenu: TMenuItem;
  17.     ExitMenu: TMenuItem;
  18.     OpenDialog: TOpenDialog;
  19.     ControlMenu: TMenuItem;
  20.     PlayMenu: TMenuItem;
  21.     PauseMenu: TMenuItem;
  22.     StopMenu: TMenuItem;
  23.     ToolBar: TToolBar;
  24.     btPreviousChapter: TToolButton;
  25.     btRewind: TToolButton;
  26.     btPause: TToolButton;
  27.     btPlay: TToolButton;
  28.     btStop: TToolButton;
  29.     btFastForward: TToolButton;
  30.     btNextChapter: TToolButton;
  31.     ToolButton8: TToolButton;
  32.     btRootMenu: TToolButton;
  33.     btFullScreen: TToolButton;
  34.     btFrameStep: TToolButton;
  35.     ImageList: TImageList;
  36.     StepForwardMenu: TMenuItem;
  37.     OptionsMenu: TMenuItem;
  38.     FullscreenMenu: TMenuItem;
  39.     Popup: TPopupMenu;
  40.     N1: TMenuItem;
  41.     GoToMenu: TMenuItem;
  42.     PlaySpeed1: TMenuItem;
  43.     NextChapterMenu: TMenuItem;
  44.     PreviousChapterMenu: TMenuItem;
  45.     FastForward1: TMenuItem;
  46.     Rewind1: TMenuItem;
  47.     N4: TMenuItem;
  48.     MenuRoot: TMenuItem;
  49.     TitleMenu: TMenuItem;
  50.     N5: TMenuItem;
  51.     BookmarksMenu: TMenuItem;
  52.     SavebookmarkMenu: TMenuItem;
  53.     RestorebookmarkMenu: TMenuItem;
  54.     Play2: TMenuItem;
  55.     Pause2: TMenuItem;
  56.     Stop2: TMenuItem;
  57.     N2: TMenuItem;
  58.     GoTo2: TMenuItem;
  59.     NextChapter2: TMenuItem;
  60.     PreviousChapter2: TMenuItem;
  61.     PlaySpeed2: TMenuItem;
  62.     FastForward2: TMenuItem;
  63.     Rewind2: TMenuItem;
  64.     N3: TMenuItem;
  65.     MenuRoot2: TMenuItem;
  66.     TitleMenu2: TMenuItem;
  67.     Fullscreen2: TMenuItem;
  68.     N6: TMenuItem;
  69.     Bookmarks2: TMenuItem;
  70.     Savebookmark2: TMenuItem;
  71.     Restorebookmark2: TMenuItem;
  72.     StatusBar: TStatusBar;
  73.     N7: TMenuItem;
  74.     progdigycom1: TMenuItem;
  75.     VideoWindow: TVideoWindow;
  76.     FilterGraph: TFilterGraph;
  77.     procedure PlayMenuClick(Sender: TObject);
  78.     procedure btStopClick(Sender: TObject);
  79.     procedure btPauseClick(Sender: TObject);
  80.     procedure btFullScreenClick(Sender: TObject);
  81.     procedure btFrameStepClick(Sender: TObject);
  82.     procedure btRootMenuClick(Sender: TObject);
  83.     procedure VideoWindowMouseMove(Sender: TObject; Shift: TShiftState; X,
  84.       Y: Integer);
  85.     procedure VideoWindowMouseUp(Sender: TObject; Button: TMouseButton;
  86.       Shift: TShiftState; X, Y: Integer);
  87.     procedure btNextChapterClick(Sender: TObject);
  88.     procedure btPreviousChapterClick(Sender: TObject);
  89.     procedure btFastForwardClick(Sender: TObject);
  90.     procedure btRewindClick(Sender: TObject);
  91.     procedure TitleMenuClick(Sender: TObject);
  92.     procedure SavebookmarkMenuClick(Sender: TObject);
  93.     procedure RestorebookmarkMenuClick(Sender: TObject);
  94.     procedure ExitMenuClick(Sender: TObject);
  95.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  96.     procedure OpenMenuClick(Sender: TObject);
  97.     procedure FilterGraphDVDTitleChange(sender: TObject; title: Integer);
  98.     procedure FilterGraphDVDChapterStart(sender: TObject;
  99.       chapter: Integer);
  100.     procedure FilterGraphDVDCurrentHMSFTime(sender: TObject;
  101.       HMSFTimeCode: tagDVD_HMSF_TIMECODE; TimeCode: tagDVD_TIMECODE);
  102.   private
  103.     { D閏larations priv閑s }
  104.   public
  105.     { D閏larations publiques }
  106.     procedure PlayDVD(FileName: WideString);
  107.   end;
  108. var
  109.   FormDVDPlayer: TFormDVDPlayer;
  110. implementation
  111. {$R *.DFM}
  112. procedure TFormDVDPlayer.PlayDVD(FileName: WideString);
  113. var
  114.   Status : TAMDVDRenderStatus;
  115.   DvdCmd: IDvdCmd;
  116.   HR: HRESULT;
  117. begin
  118.   // Activate the filter Graph
  119.   if not FilterGraph.Active then
  120.   begin
  121.     FilterGraph.Active := true;
  122.     // Render DVD
  123.     HR := FilterGraph.RenderDvd(Status, FileName);
  124.     if HR <> S_OK then
  125.     begin
  126.       case HR of
  127.         HRESULT(E_INVALIDARG): Application.MessageBox('Invalid Argument.','Error', mb_ok);
  128.         HRESULT(S_FALSE)     : begin
  129.                         if Status.hrVPEStatus <> 0 then Application.MessageBox(PChar(GetErrorString(Status.hrVPEStatus)), 'Error', mb_OK);
  130.                         if Status.bDvdVolInvalid   then Application.MessageBox('The specified DVD volume to be played does not exist.', 'Error', mb_OK);
  131.                         if Status.bDvdVolUnknown   then Application.MessageBox('No DVD volume is specified or isn''t found.', 'Error', mb_OK);
  132.                         if Status.bNoLine21In      then Application.MessageBox('The video decoder doesn''t produce line 21 (closed captioning) data.', 'Error', mb_OK);
  133.                         if Status.bNoLine21Out     then Application.MessageBox('The video decoder can''t be shown as closed captioning on video due to a problem with graph building.', 'Error', mb_OK);
  134.                         if status.iNumStreamsFailed > 0 then Application.MessageBox('Can''t render one or more stream.', 'Error', mb_OK);
  135.                       end;
  136.         HRESULT(VFW_E_DVD_DECNOTENOUGH) : Application.MessageBox('There isn''t enough hardware or software decoders to decode all streams.','Error', mb_OK);
  137.         HRESULT(VFW_E_DVD_RENDERFAIL)   : Application.MessageBox('Some basic error occurred in building the graph.'#13'Possibilities include the DVD Navigator filter or the video or audio renderer not instantiating,'#13'a trivial connection or pin enumeration failing, or none of the streams rendering.','Error', mb_OK);
  138.       end;
  139.       FilterGraph.ClearGraph;
  140.       exit;
  141.     end;
  142.     FilterGraph.Play;
  143.     with FilterGraph as IDVDControl2 do
  144.     begin
  145.       SetOption(DVD_NotifyParentalLevelChange,false); //not notify us when parental level changes
  146.       SetOption(DVD_HMSF_TimeCodeEvents, true);       // use new HMSF timecode format
  147.     end;
  148.   end
  149.   else
  150.   begin
  151.     FilterGraph.Play;
  152.     with FilterGraph as IDvdControl2 do PlayForwards(1.0,DVD_CMD_FLAG_None, DvdCmd);
  153.   end;
  154. end;
  155. procedure TFormDVDPlayer.PlayMenuClick(Sender: TObject);
  156. begin
  157.   PlayDVD('');
  158. end;
  159. procedure TFormDVDPlayer.btStopClick(Sender: TObject);
  160. begin
  161.   FilterGraph.Stop;
  162. end;
  163. procedure TFormDVDPlayer.btPauseClick(Sender: TObject);
  164. begin
  165.   FilterGraph.Pause;
  166. end;
  167. procedure TFormDVDPlayer.btFullScreenClick(Sender: TObject);
  168. begin
  169.   VideoWindow.FullScreen := not VideoWindow.FullScreen;
  170.   btFullScreen.Down := VideoWindow.FullScreen;
  171. end;
  172. procedure TFormDVDPlayer.btFrameStepClick(Sender: TObject);
  173. begin
  174.   if FilterGraph.Active then
  175.     with FilterGraph as IVideoFrameStep do Step(1,nil);
  176. end;
  177. procedure TFormDVDPlayer.btRootMenuClick(Sender: TObject);
  178. var DvdCmd: IDvdCmd;
  179. begin
  180.   if FilterGraph.Active then
  181.     with FilterGraph as IDvdControl2 do ShowMenu(DVD_MENU_Root, 0, DvdCmd);
  182. end;
  183. procedure TFormDVDPlayer.VideoWindowMouseMove(Sender: TObject;
  184.   Shift: TShiftState; X, Y: Integer);
  185. var Point : TPoint;
  186. begin
  187.   if FilterGraph.Active then
  188.     with FilterGraph as IDvdControl2 do
  189.     begin
  190.       Point.x := x;
  191.       Point.y := y;
  192.       SelectAtPosition(Point);
  193.     end;
  194. end;
  195. procedure TFormDVDPlayer.VideoWindowMouseUp(Sender: TObject;
  196.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  197. var Point : TPoint;
  198. begin
  199.   if FilterGraph.Active then
  200.     with FilterGraph as IDvdControl2 do
  201.     begin
  202.       Point.x := x;
  203.       Point.y := y;
  204.       ActivateAtPosition(Point);
  205.     end;
  206. end;
  207. procedure TFormDVDPlayer.btNextChapterClick(Sender: TObject);
  208. var DvdCmd: IDvdCmd;
  209. begin
  210.   if FilterGraph.Active then
  211.     with FilterGraph as IDvdControl2 do PlayNextChapter(DVD_CMD_FLAG_None, DvdCmd);
  212. end;
  213. procedure TFormDVDPlayer.btPreviousChapterClick(Sender: TObject);
  214. var DvdCmd: IDvdCmd;
  215. begin
  216.   if FilterGraph.Active then
  217.     with FilterGraph as IDvdControl2 do PlayPrevChapter(DVD_CMD_FLAG_None, DvdCmd);
  218. end;
  219. procedure TFormDVDPlayer.btFastForwardClick(Sender: TObject);
  220. var DvdCmd: IDvdCmd;
  221. begin
  222.   if FilterGraph.Active then
  223.     with FilterGraph as IDvdControl2 do PlayForwards(8.0,DVD_CMD_FLAG_None, DvdCmd);
  224. end;
  225. procedure TFormDVDPlayer.btRewindClick(Sender: TObject);
  226. var DvdCmd: IDvdCmd;
  227. begin
  228.   if FilterGraph.Active then
  229.     with FilterGraph as IDvdControl2 do PlayBackwards(8.0,DVD_CMD_FLAG_None, DvdCmd);
  230. end;
  231. procedure TFormDVDPlayer.TitleMenuClick(Sender: TObject);
  232. var DvdCmd: IDvdCmd;
  233. begin
  234.   if FilterGraph.Active then
  235.     with FilterGraph as IDvdControl2 do ShowMenu(DVD_MENU_Title, DVD_CMD_FLAG_None, DvdCmd);
  236. end;
  237. procedure TFormDVDPlayer.SavebookmarkMenuClick(Sender: TObject);
  238. begin
  239.   FilterGraph.DVDSaveBookmark(ExtractFilePath(Application.EXEName)+'bookmark.bmk');
  240. end;
  241. procedure TFormDVDPlayer.RestorebookmarkMenuClick(Sender: TObject);
  242. begin
  243.   FilterGraph.DVDRestoreBookmark(ExtractFilePath(Application.EXEName)+'bookmark.bmk');
  244. end;
  245. procedure TFormDVDPlayer.ExitMenuClick(Sender: TObject);
  246. begin
  247.   FilterGraph.ClearGraph;
  248.   FilterGraph.Active := false;
  249.   Application.Terminate;
  250. end;
  251. procedure TFormDVDPlayer.FormCloseQuery(Sender: TObject;
  252.   var CanClose: Boolean);
  253. begin
  254.   ExitMenuClick(nil)
  255. end;
  256. procedure TFormDVDPlayer.OpenMenuClick(Sender: TObject);
  257. begin
  258.   if OpenDialog.Execute then
  259.   begin
  260.     FilterGraph.ClearGraph;
  261.     FilterGraph.Active := false;
  262.     PlayDVD(OpenDialog.FileName);
  263.   end;
  264. end;
  265. procedure TFormDVDPlayer.FilterGraphDVDTitleChange(sender: TObject;
  266.   title: Integer);
  267. begin
  268.   statusbar.Panels.Items[1].Text := 'Title '+inttostr(title);
  269. end;
  270. procedure TFormDVDPlayer.FilterGraphDVDChapterStart(sender: TObject;
  271.   chapter: Integer);
  272. begin
  273.   statusbar.Panels.Items[2].Text := 'Chapter '+ inttostr(chapter);
  274. end;
  275. procedure TFormDVDPlayer.FilterGraphDVDCurrentHMSFTime(sender: TObject;
  276.   HMSFTimeCode: tagDVD_HMSF_TIMECODE; TimeCode: tagDVD_TIMECODE);
  277. begin
  278.   with HMSFTimeCode do
  279.     StatusBar.Panels.Items[0].Text :=
  280.       format('%d:%d:%d',[bHours, bMinutes ,bSeconds]);
  281. end;
  282. end.