一 Windows Media SDK
Microsoft Windows Media技術是通過公司intranets與Internet串流多媒體內容的強大方案,該平台支援網址和網頁開發,以連續資料流傳輸音頻、視頻和指令碼命令。串流多媒體能力讓使用者通過網路邊下載邊播放內容,減少等待時間和對使用者電腦的儲存要求。同時使不限長度的示範(如現場直播)成為可能。
Windows Media 支援人員各種網路和協議。媒體格式說明安排、組織同步多媒體資料的傳輸檔案格式,並為通過網路傳輸及在客戶機上播放作了最佳化。媒體格式不僅為記錄檔案指定了格式,也為現場直播指定了格式。 運行Microsoft? Windows Media? 服務的伺服器支援單播和組播。Microsoft? Windows Media?軟體開發包(SDK)中有六個主要組件,如表 所示:
表 Windows Media SDK中主要組件
Windows Media Services SDK
管理單播和組播服務
Windows Media Encoder SDK
支援設定和控制 Windows Media編碼器的自動化介面
Windows Media Player SDK
支援indows Media&Player ActiveX控制項,可向基於COM的文檔(網頁)提供多媒體能力
Windows Media Metafiles
支援建立元檔案播放清單,包括廣告插播,banner 和流的無縫切換
Windows Media Format SDK
支援對Windows Media檔案的讀、寫和編輯
Windows Media Rights Manager SDK
支援保護Windows Media文
二 Windows Media 服務SDK
Microsoft Windows Media 服務(SDK)包括一系列廣泛的技術,某些部分滿足網站開發需要,其它部分針對網際網路服務提供者 (ISVs)。Windows Media 服務SDK包括組件如下。
Windows Media Unicast控制項 :
一套Microsoft ActiveX控制項,控制設定、監控和管理Windows Media單播服務屬性。
Windows Media Station控制項:
控制設定、監控和管理Windows Media組播服務屬性。
Windows Media 服務授權API:
COM相容API ,用來開發給使用者授權的程式包。
Windows Media 服務事件通知和授權API:
COM相容API,用來開發給伺服器授權的程式包。
Windows Media 服務檔案傳輸控制項:
一個ActiveX 控制項,用來接收組播檔案傳輸。
2.1 Windows Media單播控制項
Windows Media 單播服務包含在Nsunimgr.ocx 檔案中,包括兩個控制項: Windows Media 單播管理(Admin)和Windows Media單播跟蹤(TraceView)。前者用來設定和管理伺服器,後者用於監控伺服器事件。要使用Windows Media單播服務控制項,電腦上必須註冊Nsunimgr.ocx 和Nsoobj.dll檔案。
Admin 控制項是一個ActiveX 控制項,用於管理Windows Media伺服器單播。除暴露屬性、方法和事件外,它也管理一組提供不同服務的對象。例如, Client 對象表示串連到伺服器的客戶,而Clients對象表示客戶對象的集合。Admin 控制項功能如下:
設定與查詢服務器屬性,如最大集合頻寬和串連使用者最大數目。
監控客戶活動,包括串連、斷開與播放剪輯標題。
監控整個系統活動,包括伺服器狀態、管理功能和伺服器限制。
過濾控制項接收的事件類型。
Admin 控制項暴露的屬性是運行時屬性,即在設計應用時不可用。直到Connect方法成功完成才可設定或返回屬性值。
TraceView為監控Windows Media服務的單播活動提供了一個便於使用的介面。 它的圖形化使用者介面用來顯示運行Windows Media服務所啟用的事件列表,包括事件描述、事件所觸發的日期與時間。
SDK安裝程式安裝並註冊Windows Media 單播控制項及相關檔案。如同其它ActiveX控制項,你可在HTML頁面、VB與VC++應用程式中直接使用此控制項。使用TraceView控制項可執行下列功能:
暫停並恢複事件監控。
清除事件記錄顯示。
選擇監控的事件類型,包括Server, Client, Admin, 和Alert 事件。
要啟用嵌入在應用程式中的TraceView 控制項,必須調用其 SetServer 方法進行初始化。它將TraceView 控制項串連到伺服器,使其可開始接收事件並顯示出來。
2.2 Windows Media Station控制項
Windows Media Station控制項是一個ActiveX? 控制項,允許管理員設定廣播組播站、啟動或停止流。Station 控制項可執行下列任務:
建立、刪除和管理站。
建立、刪除和管理流。
Creating, deleting, and managing 建立、刪除和管理用戶端。
建立、刪除和管理主機地址
建立、刪除和管理站Windows Media Station 控制項對象。
站為流定義發送機制。例如,站包含站名稱、目標的組播地址、站格式等等。站本身並不包含媒體內容,而是描述內容如何發送。每個站可串連一個或多個客戶,客戶可以是Windows Media? Encoder或另外Windows Media Station 控制,也可以是通過媒體流廣播發布(MSBD)協議串連到伺服器的Windows Media? Player案例。站與主機地址相關,伺服器網卡使用該地址廣播內容。Windows Media Station控制對象管理下列對象:
Channels 集合對象,包含很多Channel 對象。
Channel 對象,管理ChannelFormats 管理對象。
ChannelFormats集合對象,包括很多ChannelFormat 對象。
ChannelFormat對象,管理StreamDescriptors集合對象。
StreamDescriptors集合對象,包含很多StreamDescriptor 對象。
StreamDescriptor對象,描述流特徵。
Streams集合對象,包含很多Stream對象。
Stream對象, 定義媒體流內容。
Clients集合對象, 包含很多 Client對象。
Client對象,定義管理使用者。
HostAddresses集合對象,包含很多Address 對象。
Address 對象,定義組播地址。
要使用Windows Media Station 控制項(Nschmgr.ocx),必須安裝Windows Media 服務,或將Nschmgr.ocx控制項拷貝到電腦並以RegSvr32 應用程式註冊。
建立點播組播
2.3 Windows Media服務認證API
Windows Media服務認證API設計用來提供建立使用者認證外掛程式組件。使用者向擁有認證特徵的伺服器發出請求時,伺服器驗證使用者身份。基於各種認證協議,一般檢驗使用者的使用者名稱和密碼。Windows Media服務認證者是基於COM的對象。每個認證者實現一種認證。儘管在一個系統中可註冊多個認證者,但在某時刻只能使用一個認證者。
Windows Media 服務需求 COM 組件支援多線程(COINIT_MULTITHREADED)模型,當建立認證組件時,必須避免使用單線程(COINIT_APARTMENTHREADED) 模型。前者提供較好效能和靈活性,但並行存取模型缺乏安全執行緒特徵。
認證類型描述用來交換認證資訊的安全性通訊協定。不同認證者可有同樣的類型,但根據不同資料庫驗證使用者。因此類型僅描述資訊如何交換,而不是處理資訊如何驗證。 Windows Media伺服器與Media? 播放器支援兩種內建的認證協議:
HTTP-BASIC
Microsoft Windows NT LAN 管理器(NTLM)
HTTP-BASIC以文字格式設定交換資訊,包括使用者名稱和密碼。該協議是Internet應用的理想協議。對NTLM認證,伺服器使用加密的請求/回應程式案給使用者認證,更適用於intranet應用。
下面簡要描述認證API的使用:
1、初始化
首先,伺服器查詢系統註冊表尋找認證外掛程式組件,如返回成功資訊,伺服器檢索外掛程式組件類標識 (CLSID) 並案例化該外掛程式對象。然後,伺服器初始化此案例對象。上下文內容包括描述伺服器某些特徵的屬性,如:
伺服器名和別名。
伺服器版本號碼。
Initialize方法為認證者執行預備認證任務提供機會,如建立使用者帳戶串連、給認證者分配系統資源。
2、獲得認證類型
初始化認證外掛程式對象後,伺服器調用GetAuthenticationType 方法檢索認證類型。播放器必須能識別此類型,目前Windows Media播放器僅支援HTTP-BASIC和NTLM 兩種類型。
3、使用者認證對象
認證對象由認證者對象管理,它實現INSSAuthenticator 介面。在使用者每次串連時,檢驗並驗證使用者資訊。使用者每次串連到伺服器時建立不同的認證對象。伺服器調用CreateUserAuthentication 方法建立使用者認證對象。
4、認證運行方式
使用者每次請求開啟標題,伺服器就通知Windows Media 播放器需要使用者認證。伺服器向使用者請求使用者名稱和密碼等資料,並將資料轉送到認證者檢驗。認證者使用伺服器傳進驗證資訊與對應使用者資料庫比較,通知伺服器驗證結束或需要進一步交流。Windows Media 播放器提示使用者輸入使用者名稱與密碼驗證資訊,並將其發送到伺服器。伺服器又將資訊傳遞給認證者檢驗,認證者根據資料庫中使用者資訊進行檢驗,並將結果通知伺服器。根據結果,伺服器允許或拒絕使用者訪問內容。
5、認證後
確定使用者身份後,伺服器將此指標拷貝到使用者內容相關的NSS_USER_AUTHENTICATION 屬性。認證結果與使用者名稱可通過INSSUserAuthentication介面檢索。
6、註冊認證者
安裝Windows Media 服務元件時,在電腦註冊表中加入類似如下的索引值:
[HKEY_LOCAL_MACHINE\Software\Microsoft\NetShow\Servers\
\Default\Authentication]
[HKEY_LOCAL_MACHINE\Software\Microsoft\NetShow\Servers\
\Default\Authentication\Sample Authentication Module]
"CLSID"="{16DA4310-2955-11D1-9E98-006097D2D7CF}"
"Description"="Sample Authentication module"
"Author"="Developer Name"
"Copyright"="? Developer 1998"
"Enabled"=dword:00000001
第三節 Windows Media編碼器SDK
Windows Media? Encoder主要用於將媒體內容編碼成Windows Media? 格式流或檔案。媒體格式流或檔案包含音頻、視頻或指令碼資料。媒體編碼器以Idispatch介面暴露方法和屬性。
首先,必須為媒體編碼器指定GUID:
static const GUID CLSID_IAsfRTEncoder =
{ 0x7DEBA670, 0x68AB, 0x11D0, { 0x98, 0xEB, 0x00, 0xaa, 0x00, 0xbb, 0xb5, 0x2c } };
接著用函數ConnectToEnc嘗試串連到媒體編碼器的一個案例,如串連成功,函數返回一個有效指標pIRexUnknown,該指標指向IUknown 介面。然後使用QueryInterface 獲得 IDispatch 介面:
STDMETHODIMP CMyClass::ConnectToEnc(IDispatch **pIDispatch)
{
HRESULT hr;
IUnknown *pIRexUnknown = NULL;
if (NULL == pIDispatch)
return E_INVALIDARG;
hr = GetActiveObject(CLSID_IAsfRTEncoder, NULL, &pIRexUnknown);
if (SUCCEEDED(hr))
hr = pIRexUnknown->QueryInterface(IID_IDispatch, (LPVOID *)pIDispatch);
if (pIRexUnknown)
pIRexUnknown->Release();
return hr;
}
StartNewEnc 函數使用CoCreateInstance 函數建立一個新媒體編碼器案例:
STDMETHODIMP CMyClass::StartNewEnc(IDispatch **pIDispatch)
{
HRESULT hr;
IUnknown *pIRexUnknown = NULL;
if (NULL == pIDispatch)
return E_INVALIDARG;
hr = CoCreateInstance(CLSID_IAsfRTEncoder,
NULL,
CLSCTX_SERVER,
IID_IDispatch,
(LPVOID *)pIDispatch);
return hr;
}
一旦媒體編碼器被安裝,就可使用pIDispatch指標激發編碼器方法並操縱其屬性。現在可開始編碼工作:
Dim Encoder As Object
Set Encoder = CreateObject("ASF.RealTimeEncoder")
Encoder.LoadASD("c:\SampleConfig.asd")
Encoder.Start
停止編碼方法如下:
Encoder.Stop
Set Encoder = Nothing
將內容記錄到.asf檔案的代碼如下:
Encoder.RecordMaxSize = 5000 ' 5 MB file maximum size
Encoder.RecordFileName = "c:\Sample.asf"
Encoder.RecordStart
停止記錄使用如下方法:
Encoder.RecordStop