程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi在局域網中實現網上影院

用Delphi在局域網中實現網上影院

編輯:Delphi

<<家庭電腦世界>>

<<家庭電腦世界>>稿件                                   用Delphi在局域網中實現網上影院
                                                                    陳經韬
   相信用過<<超級解霸>>的人都知道裡面有個"接收網絡DVB廣播",可以在局部網中實現一台計算機播放視頻文件而另一台接收.因為DVB設計的知識面太廣,下面我們用另外一個巧妙的思路來實現局部網中的"網絡播放".因為涉及到多媒體文件的播放,所以我們在程序中使用了一個 Mediaplay控件,但是很多使用過這個控件做播放器的人都遇到過這樣一個問題:就是在播放MPG等擴展名的文件時出現"MCI初始化錯誤",如果安裝了WindvdPlayer後又沒有問題了,怎麼回事呢?現在市面上所有的有關DELPHI多媒體編程的書都沒有講到這個問題和如何解決.原來,我們要自己修改win.ini裡面[mci extensions]小節,另外還要修改一下system.ini裡面的[mci]小節.舉例說,你想讓Mediaplay可以播放MPG為擴展名的文件時,可以按照如下格式修改:
[mci extensions]
mpeg=MPEGVideo
mpg=MPEGVideo
...
  在這裡,我們寫了個自定義函數WriteMciConfig來達到這一目的,詳細代碼請看源程序.
  解霸的左右聲道設置好像也沒有什麼書籍介紹如何實現,實際上我們可以調用底層API函數mciSendString,不過好像只對Wav,Mid等音頻文件有效.比如說左聲道設置:
mciSendString(set all audio all off,nil,0,Handle);
mciSendString(set all audio left on,nil,0,Handle);
  先把所有聲道關閉,然後打開左聲道.如果你設計過防火牆,會發現有些防火牆也是這樣的:先關上所有端口,然後打開常用的端口.注意:因為這裡調用了多媒體方面的API,所以程序必須加上MMsystem這個單元,否則將無法編譯.
  還有一個難點就是如何實現全屏幕播放.可能讀者會說:先把Form的BorderStyle動態設置為BsNone,再把Form的WindowState:=wsMaximized不就行了嗎?呵呵,是嗎?你試試看.結果播放屏幕的視頻不見了.只看到一個光禿禿的面版.解決的方法是用API函數:
SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and (not WS_CAPTION));
  動態把窗口標題欄隱藏起來,再最大化.另外,為了保持窗口最大化後播放的尺寸仍然保持跟窗口大小融合,必須在窗口的OnResize事件中寫上MediaPlayer1.DisplayRect:=Panel1.ClientRect;另外,程序中還有"彈出CD-ROM",文件拖放,音量控制等功能,讀者可自行參考代碼,均附了注釋.
  實際上,我們上面的程序已經是一個功能比較完善的"多媒體播放器"了,下面我們就來添加我們的"網絡播放"功能.
  先來熱熱身.
  大家知道,局部網中大家互相訪問對方共享的文件夾時,可以直接在IE的地址欄輸入如"\機器名共享名"形式來打開.比如說電腦Boy的共享文件夾mpgfile下有一個MPG文件Andy.mpg,則平時我們就可以用"\BoympegfileAndy.mpg"來打開它.聰明的讀者可能已經想到,把這個名稱傳給播放器不就可以播放了嗎?對!我們的程序原理是這樣的:甲機播放視頻文件時,動態把文件所在目錄"隱形"共享,並打開一個Socket服務進行監聽,當客戶Socket連接時把文件完整的路徑和名稱發送過去,客戶機取得名稱後賦給Mediaplay控件的Filename即可進行播放.
  但是現在問題又來了:
  一:如何實現"動態共享"?你總不能叫用戶自己去擊鼠標共享吧?
  二:如何實現"隱形共享"?這裡的"隱形"包括兩方面:比如說Boy共享了一個文件夾,那麼必須做到同一個局部網的用戶打開"網上鄰居"時看不見該文件夾.另外,用戶在Boy上共享的文件夾擊鼠標右鍵的"共享"一項裡看不到該文件夾共享.
  共享文件夾可以通過修改注冊表,而且在DELPHI中操作注冊表也很簡單.但是通過修改注冊表實現共享必須在電腦重新啟動後才生效,即使你用API向系統廣播注冊表內容已經改變的消息也無效.但是為什麼Windows系統本身可以實現動態共享?它肯定調用了什麼東西.是什麼呢?原來在Win9X下它調用了SVRAPI.DLL中的一個函數:NetShareAdd,在NT/2000下則是NETAPI32.DLL.其實有很多所謂的"系統漏洞",比如說在Win9x下動態隱藏自己的功能就是系統自己本身用的用來運行某些系統程序的功能,而不是什麼漏洞.只不過是微軟不公布,後來有人發現了才叫"漏洞".跟蹤系統和分析系統可以讓你跟系統更加靠近.因為網絡共享這個不是我們的主題,所以下面只給出實現的單元My_Share(見源代碼),感興趣的朋友可自行翻閱相關資料.調用規則如下:
刪除一個共享:DeleteShare(nil, Pchar(共享名稱));
添加一個只讀共享:
ShareResource(nil, pchar(路徑), Pchar(共享名稱), Pchar(共享說明),STYPE_DISKTREE,SHI50F_RDONLY,,);
添加一個完全共享:
ShareResource(nil, pchar(路徑), Pchar(共享名稱), Pchar(共享說明),STYPE_DISKTREE,SSHI50F_FULL,,);
  好,第一個問題解決了,下面來解決第二個.我也不想浪費納稅人的金錢了.具體方法如下:
一:添加一個參數SHI50F_SYSTEM,這樣一來在共享的文件夾擊右鍵的"共享"裡面就看不到自己的文件夾共享了.
如:ShareResource(nil, pchar(路徑), Pchar(共享名稱), Pchar(共享說明), STYPE_DISKTREE, SHI50F_RDONLY or SHI50F_SYSTEM, , );
二:共享文件夾時在共享名稱後面加上一個$符號,這樣一來打開"網上鄰居"就看不見共享的文件夾了,但是還是可以訪問.
如:\BoyMyfile$
  好,到這裡我們的具有"網絡播放"功能的播放器就完成了.程序代碼很粗糙,沒有作過多容錯檢查,請讀者自行完善.另外,在程序中文件進度的拖放我們用的是Delphi自身帶的TrackBar控件,所以在播放時有時會出現稍微短暫的停頓,建議讀者改用其它控件比如說Trackbar95.為了功能的完整性和照顧沒有第三方控件的讀者,我們這裡保留了該控件.
補充:
1:本程序在Pwin98第二版+100M局部網上調試通過.
2:本程序可以改進的地方:不用Socket控件改用UDP來廣播,實現不用輸入對方IP地址完全"傻瓜式"網絡播放.或者用一台電腦做服務器,共享多個文件供客戶端有選擇的播放.實驗證明:在100M局部網上一個文件可以同時供7-8個用戶同時播放而速度無停滯.
3:真正的"網絡播放"一般是采用傳輸流來實現,具體代碼可到我站點下載.

★作者:

陳經韬

430074湖北省武漢市武昌民院路湖北經濟管理大學計算機系(本)9801班
Home:http://Lovejingtao.126.com 
E-Mail: [email protected]                   

                                 ©CopyRight 2000-2001

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved