本文章是由機器翻譯。

視訊播放

使用 Silverlight Media Framework 建置自訂播放程式

Ben Rush

串流媒體已經成為網路上無所不在。它看起來像是每個人都 — 從新聞站台 next-door 鄰居的社交網路 — 是參與線上視訊經驗。由於給人氣指數中這個突波,大多數網站想要呈淚高品質視訊 — 與通常高品質 頻寬感知 視訊 — 其消費者可靠且易於使用的方式。

索引鍵的項目,在線上的媒體傳遞經驗是本身的玩家。播放程式是客戶與,互動,而且驅動使用者 ’s 線上經驗的每個項目。這麼多注意在播放程式上置中,與它 ’s 現代、 Web 架構的媒體播放程式變得許多更複雜實作比原本甚至幾年前的順序沒有驚喜。如此一來,開發人員需要健全架構,他們可以在其建置他們的玩家。

Silverlight 媒體 Framework (SMF) 是在 2009 Microsoft 專業開發人員會議的 Microsoft 已發行的開放原始碼專案。它是一個可延伸和高度可調適 Silverlight 視訊架構,直接為您解答在其開發人員和設計工具可以建立自己的玩家的穩定核心的需求。中間的 Silverlight 媒體 Framework 程式碼已被 (精緻) 根據從 NBC Olympics 和星期日祈足球 Web 視訊專案的教訓。

本文將說明基本的 SMF 的項目,示範如何將 SMF 整合至播放程式的專案,並帶您逐步完成簡單的專案,用來建立自訂的玩家經驗的 SMF。我顯示如何使用記錄、 設定和 SMF 的事件處理功能。最後,我建立顯示供進一步檢視目前的視訊結束時的建議的視訊的播放程式應用程式。

使用者入門 SMF

快速入門要執行的動作,第一件事,是從 Codeplex ( 下載架構smf.codeplex.com).您也需要下載 [平滑串流播放程式開發套件 (iis.net/expand/smoothplayer) 並在使用 SMF 任何專案中參考它。平滑串流播放程式開發套件不屬於 SMF — ’s 完全分開、 關閉來源元件。不過,SMF 運用此套件的功能一組核心特別視訊播放程式本身。為的這篇文章撰寫,平滑的 [資料流] 播放程式開發套件是在 Beta 2。

SMF 組成的 Microsoft.NET 組件的數目 (如 所示圖 1),每個的整體架構的不同功能部分。

圖 1Silverlight 媒體 Framework 組件

核心組件是由許多公用程式類別和整個架構的其他參考型別所組成的 Microsoft.SilverlightMediaFramework.dll。使用 [SMF 的任何層面時您也必須參考 Microsoft.SilverlightMediaFramework.dll 組件。

Microsoft.SilverlightMediaFramework.Data 命名空間提供 Helper 類別的消耗外部播放程式的資料以及封裝內播放程式的資料。資料可以是一般與任何表單,但它也可以是播放程式本身的設定資訊。有 ’s 另一個命名空間,Microsoft.SilverlightMediaFramework.Data.Settings,對於型別代表和處理的玩家設定。

用於設定資料,分開很可能是您與互動的資料命名空間內類型是資料流出 DataClient 類別可以從外部來源擷取資料。如果您想要下載並使用播放程式的外部資料,您可以參考這個組件。

SMF 玩家包括健全使用回呼樣式典範,寫入至記錄基礎結構會引發事件的 Microsoft.SilverlightMediaFramework.Logging 架構。與記錄] 系統註冊您自己的回呼方法,和這些回呼執行一次叫用 (Invoke) 的其他作業 — 例如公佈到 Web 服務的資訊,或加入的文字方塊中顯示的資訊。如果您想要使用內建的記錄機能的 SMF,您可以參考這個組件。

Microsoft.SilverlightMediaFramework.Player 組件會實作本身的玩家。它也提供了數個控制項在播放程式依賴,例如一個 scrubber 音量控制和時間表標記。預設 SMF 玩家 sleek,清除任何需要 Silverlight 播放程式的專案的一個絕佳起點。不過,SMF 內定義的所有控制項的中央是控制項樣板化的概念,所以使用如運算式調和或 Visual Studio 工具,每個控制項可以是已設定主題。

建置和參考 SMF

SMF 下載成單一的.zip 檔案找出方案檔的每個輸出程式庫專案並測試執行和驗證玩家本身的專案。

SMF 依靠平滑的 [資料流] 播放程式開發套件。要參考此套件,將移至的 SMF 專案的 [\Lib] 資料夾的平滑串流的組件 (Microsoft.Web.Media.SmoothStreaming.dll)。

接下來,Visual Studio 中開啟 SMF 方案,並建置它,建立運用架構所需的所有組件。若要確認所有項目執行如預期般,按下 F5 以開始偵錯]。將會建置方案,而 Microsoft.SilverlightMediaFramework.Test.Web 目標會執行與預設 SMF 播放程式串流處理 「 大 Buck 兔寶寶 」 視訊呈現您 (請參閱 圖 2).請注意如何完成預設播放程式已經,與快轉、 播放/停止/暫停按鈕、 音量控制、 全螢幕控制項和等等的位置項目。

圖 2SMF 播放程式和大 buck 兔寶寶視訊

下一步是建立個別的 [Silverlight] 專案,並運用從 SMF 當中。在 Visual Studio 按一下 [檔案] | 新增 | 專案 | Silverlight 應用程式。呼叫 SMFPlayerTest 方案,然後按一下 [確定]。強制回應對話方塊就會快顯,詢問您是否要裝載新的網站中的 Silverlight 應用程式。按一下 [確定],您看到基本的 Silverlight 應用程式方案 SMFPlayerTest 和 SMFPlayerTest.Web 的兩個專案所組成。

最後一個步驟是從您新建立的專案參考平滑串流播放程式開發套件和 SMF 的組件。從 SMF 方案 ’s 偵錯] 資料夾複製輸出 SMF 組件和平滑串流播放程式開發套件,並將它們貼到新的專案,如 所示圖 3.新方案現在包含充份利用 [SMF 所需的所有組件參考。

圖 3參考所需的組件

顯示播放程式

若要開始使用 [SMF,包括 MainPage.xaml 網頁內的 SMF 玩家 ’s 命名空間。如此可確保所有參考正確都解析:

xmlns:p="clr-namespace:Microsoft.SilverlightMediaFramework.Player;assembly=Microsoft.SilverlightMediaFramework.Player"

現在插入頁面 ’s LayoutRoot 多筆編輯控制項內的玩家 ’s XAML: 

<Grid x:Name="LayoutRoot">
  <p:Player>
  </p:Player>
</Grid>

按 F5 將啟動專案,並帶出 SMF 玩家。 不過,因為播放程式 hasn’t 被告知要播放什麼,它沒有作用。 所有您取得不是播放程式播放任何內容。

SMF 使用 (從 [平滑串流播放程式開發套件) SmoothStreamingMediaElement 播放視訊。 從 SmoothStreamingMediaElement,SMF 會繼承它自己玩家稱為 CoreSmoothStreamingMediaElement。 這個物件是必要的如果您想傳送內容串流的玩家。 請務必將 SmoothStreamingSource] 屬性設定為一個有效平滑串流媒體 URL:

<Grid x:Name="LayoutRoot">
  <p:Player>
    <p:CoreSmoothStreamingMediaElement
      AutoPlay="True"
      SmoothStreamingSource="replace with address to content here"/>
  </p:Player>
</Grid>

如同稍早提到 Microsoft 提供 「 大 Buck 兔寶寶 」 範例視訊資料流,開發人員可以用它來測試 Silverlight 的專案。 若要將此測試資料流請將 SmoothStreamingSource 屬性設定到 CoreSmoothStreamingMediaElement 上:

http://video3.smoothhd.com.edgesuite.net/ondemand/Big%20Buck%20Bunny%20Adaptive.ism/Manifest

再一次按下 F5 以建置並執行專案。 瀏覽器將與同一個玩家接著玩作為前,會執行,但這次兔之 「 大 Buck 寶寶 」 視訊會開始資料流播放程式已完全載入之後的時光。 如果您的工作已建立基本的 Silverlight 播放程式,以資料流內容,完成了。

不過,[SMF 提供相當一個位元超過我們到目前為止看到。 let’s 新增一些基本的記錄。

在播放程式中的記錄

登入 SMF 很簡單 — 它時便會記錄 「 事件會引發 LogReceived 事件。 註冊此事件的事件處理常式,並藉此接收為每個記錄的事件通知,如引發。 您如何使用通知是由您 ; 您可以在播放程式中的新視窗中顯示、 篩選事件,並通知 Web 服務,每當有特定事件取得引發或執行任何項目是您的案例的必要。

LogReceived 事件以靜態方式定義在記錄器類別本身 (Microsoft.SilverlightMediaFramework.Logging.dll 內定義),所以 ’s 能夠註冊專案內任何地方的記錄事件。 這裡 ’s 註冊並定義事件處理常式的 SMFPlayerTest 專案 MainPage.xaml 檔案內的範例:

public partial class MainPage : UserControl {
  public MainPage() {
    InitializeComponent();

    Logger.LogReceived += 
      new EventHandler<SimpleEventArgs<Log>>(
      Logger_LogReceived);
  }

  void Logger_LogReceived(object sender, 
    Microsoft.SilverlightMediaFramework.SimpleEventArgs<Log> e) {
    throw new NotImplementedException();
  }
}

SMF 會引發現成的很多事件。 若要查看它們,建立 Logger_LogReceived 方法內的中斷點,重新播放程式一次在偵錯模式中。 幾乎立即將取得叫用您的中斷點,可讓您逐步執行方法 ’s 參數,並查看傳遞給它的資訊。

記錄檔事件資料被封裝內特殊的訊息物件其型別必須繼承自抽象類別名為記錄檔。 此抽象的記錄類型有三個屬性:寄件者、 訊息和時間戳記。 寄件者參考引發事件的物件。 訊息是一種物件的型別保存為記錄事件文字的 System.String。 時間戳記只會保留日期和時間的記錄物件第一次產生。 SimpleEventArgs < > 物件當做第二個參數傳遞至事件處理常式會保留透過其結果屬性記錄物件的參照。

若要引發事件記錄,所需的所有是具現化型別繼承自記錄基底類別,然後傳遞給靜態定義記錄方法的這種類型,Logger 型別上。 此架構提供一個 DebugLog 已經繼承自類別的記錄檔的基底型別。 什麼不過 ’s 特殊關於 DebugLog] 類型,是如果 Silverlight 專案參考程式庫所建立下一個偵錯建置的 「 SMF,將 DebugLog 型別傳遞至 SMF 記錄架構會引發對應的記錄事件 (並因此叫用事件處理常式)。 在另一方面,[SMF 的發行組建將會忽略取得傳遞 DebugLog 類別的記錄方法的任何呼叫。 在短如果您有偵錯陳述式,您只想要使用偵錯組建,與 DebugLog 物件做為記錄檔事件引數 ; 否則您將需要建構您自己的型別繼承自抽象的記錄檔類型。

這裡 ’s 執行個體化一個 DebugLog 物件並將它傳遞給記錄器 ’s 靜態記錄方法] (請務必平滑串流播放程式開發套件檔案建置在偵錯設定) 會引發聽候事件透過 SMF 事件系統的範例:

public MainPage() {
  InitializeComponent();

  Logger.LogReceived += 
  new EventHandler<SimpleEventArgs<Log>>(
    Logger_LogReceived);

  Logger.Log(new DebugLog { 
    Message = "Listening!", Sender = this }); 
}

從播放程式類別繼承

雖然記錄中央的播放程式功能 SMF 播放時,功能呈只可存取繼承自並開始擴充 SMF 播放程式的型別本身。

若要查看其運作方式,您需要建立新的類別稱為 SMFPlayer 繼承自播放程式類型。

新 SMFPlayer 類別看起來會像這樣:

namespace SMFPlayerTest {
  public class SMFPlayer : Player {
    public override void OnApplyTemplate() {
      base.OnApplyTemplate();
    }
  }
}

每個 FrameworkElement 型別 (例如 SMF 中的播放程式) 有每當 ApplyTemplate 事件引發時呼叫的 OnApplyTemplate 方法。 初始化 FrameworkElement 型別時,這個方法通常可做為有用的起點。

在這種情況下我覆寫新 SMFPlayer 類別內從預設 OnApplyTemplate 方法。 若要示範新 SMFPlayer 類型執行而非預設播放程式類型,您可以設定中斷點內覆寫。 當您進行偵錯在 Visual Studio 玩家這個中斷點就能在 Silverlight 執行 [SMFPlayer。

現在更新 MainPage.xaml 檔,以使用新的播放程式類別。 先,包括玩家 ’s 命名空間中的參考 (就如稍早的步驟玩家命名空間) 的命名空間清單:

xmlns:smf="clr-namespace:SMFPlayerTest"

然後只要更新播放程式標記內使用 SMFPlayer,而不是播放程式 XAML:

<Grid x:Name="LayoutRoot">
  <smf:SMFPlayer>
    <p:CoreSmoothStreamingMediaElement
      AutoPlay="true"
      SmoothStreamingSource="http://..."/>
  </smf:SMFPlayer>
</Grid>

接下來,DebugLog 類別執行個體化,並將它傳遞至記錄方法如稍早所示。 這樣就會引發的事件的您先前註冊事件處理常式:

public override void OnApplyTemplate() {
  Logger.Log(new DebugLog {
    Message = "Hello from OnApplyTemplate!",
    Sender = this
    });

  base.OnApplyTemplate();
}

若要聆聽特別為這個事件從事件處理常式內,篩選 DebugLog 物件本身的 [訊息] 屬性。 在這個範例尋找包含 「 OnApplyTemplate 」 任何訊息:

void Logger_LogReceived(
  object sender, SimpleEventArgs<Log> e) {
  if (e.Result.Message.Contains("OnApplyTemplate")) {
    return;
  }
}

使用設定資料

設定處理的成熟架構是最大型軟體專案的關鍵。 來處理 SMF 中的設定程式碼是建立在可讓您下載泛型,Microsoft.SilverlightMediaFramework.Data.dll 組件外部的資料。 設定圖層的 SMF 會使用此基礎結構到達並下載特殊格式的 XML 設定檔案位於網頁伺服器上。 一旦設定資料已被成功地下載並讀取,SMF 設定圖層會封裝它與 SettingsBase 物件,其方法再用來擷取設定值。

在 SettingsBase] 類別時建議名稱,作為可以提供強的更特定類別的基底型別設定值的存取。 這裡 ’s SettingsBase 會繼承的類別的範例。 它有一個用於擷取視訊播放程式來源 URL,另一個用於擷取布林值,指出視訊播放程式是否應該自動啟動,或等候按下 [播放] 按鈕檢視器的兩個屬性:

namespace SMFPlayerTest {
  public class SMFPlayerTestSettings : SettingsBase {
    public Uri VideoPlayerSource {
      get { return new Uri(
        GetParameterValue("videoSource")); }
    }

    public bool? AutoStartVideo {
      get { return GetParameterBoolean(
        "autoStart"); }
    }
  }
}

屬性方法使用 SettingsBase 類別所實作的函式來檢查基礎集合的設定名稱/值組載入型別 (透過機制,稍後討論)。這可以提供型別安全和 IntelliSense 友善的方法的擷取設定資訊。

現在在 SMFPlayerTest.Web 專案中建立新的 XML 檔案、 其命名為 [SMFPlayerSettings.xml,並將下列加入至它:

<?xml version="1.0" encoding="utf-8" ?>
<settings>
  <Parameters>
    <Parameter 
      Name="videoSource" 
      Value="http://video3.smoothhd.com.edgesuite.net/ondemand/Big%20Buck%20Bunny%20Adaptive.ism/Manifest"/>
    <Parameter Name="autoStart" Value="True"/>
  </Parameters>
</settings>

接下來,建立 SettingsClient 物件到其中載入設定 XML。 SettingsClient 採用 URI,指向 [設定檔:

m_settingsGetter = new SettingsClient(
  new Uri("http://localhost:10205/SMFPlayerSettings.xml"));

擷取設定資料的過程是非同步,因此回呼方法必須被指派給上 SettingsClient RequestCompleted 方法:

m_settingsGetter.RequestCompleted += 
  new EventHandler<SimpleEventArgs<SettingsBase>>
  (m_settingsGetter_RequestCompleted);

最後一個步驟就是叫用 SettingsClient 物件上無參數的擷取方法。 當擷取資料 settingsGetter_RequestCompleted 事件處理常式會被叫用 (Invoke),並且一個 SettingsBase 物件傳遞給它:

void m_settingsGetter_RequestCompleted(
  object sender, SimpleEventArgs<SettingsBase> e) {

  SettingsBase settingsBase = e.Result;
  return; 
}

由基礎架構從檔案 SMFPlayerSettings.xml 剖析為您的名稱/值組與載入 SettingsBase 物件傳遞至 settingsGetter_RequestCompleted 方法。 若要載入此資料到 SMFPlayerTestSettings 物件,只要呼叫 Merge 方法可合併設定資訊從一個 SettingsBase 衍生的物件,與另一個:

SettingsBase settingsBase = e.Result;
m_settings.Merge(settingsBase);

this.mediaElement.SmoothStreamingSource = 
  m_settings.VideoPlayerSource;
this.mediaElement.AutoPlay = 
  (bool)m_settings.AutoStartVideo; 

return;

您不再需要硬式編碼 CoreSmoothStreamingMediaElement XAML,網頁內的 [自動播放] 和 [SmoothStreamingSource] 屬性因為播放程式設定從 OnApplyTemplate 方法內下載。 這是您只需要為玩家 XAML:

<Grid x:Name="LayoutRoot">
  <smf:SMFPlayer>
    <p:CoreSmoothStreamingMediaElement/>
  </smf:SMFPlayer>
</Grid>

您在執行播放程式時設定的所有資料將會都載入、 回呼的文件將會都載入玩家 ’s 媒體元素的值,視訊會開始傳送資料流就如同先前一樣。

擴充 SMF 播放程式

在許多常用的視訊網站上, 視訊播放完成後,會看到一份相似或建議的視訊。 為了說明擴充 SMF 播放程式是多麼簡單,let’s 逐步將建置一個類似的建議檢視功能至 SMFPlayerTest 專案步驟。

MainPage.xaml 檔案中的 [播放程式] 項目將 x: Name 屬性來開始:

<Grid x:Name="LayoutRoot">
  <smf:SMFPlayer x:Name="myPlayer">
    <p:CoreSmoothStreamingMediaElement/>
  </smf:SMFPlayer>
</Grid>

這使得容易利用 Visual Studio 和運算式調和內的名稱參照 SMFPlayer 物件。

現在,在方案總管] 中 MainPage.xaml 檔案上按一下滑鼠右鍵,並選取 [運算式調和內的 [開啟]。運算式調和 3 會啟動,並顯示設計介面至 SMF 播放。在 [物件] 和 [時刻表] 區段,您尋找 myPlayer 節點的視覺物件樹狀目錄中對應於先前指定給 SMFPlayer 物件名稱。目標是建立 SMFPlayer,然後將建議的三個按鈕新增至範本的範本。使用範本中運算式調和,您可以新增、 編輯或移除玩家本身內建的控制項。

若要建立範本,請以滑鼠右鍵按一下在 [物件] 和 [時間軸 myPlayer 視窗,選取編輯範本 | 編輯副本。建立樣式資源] 對話方塊將會顯示,請按一下 [確定]。若要將三個按鈕的視訊播放程式上連按兩下按鈕圖示在 [工具] 視窗中針對您想要新增每個按鈕]。三個按鈕現在應該是可見的玩家範本所組成的控制項樹狀結構中 (請參閱 圖 4).

圖 4加入至控制項樹狀結構的按鈕控制項

樹狀目錄中選取所有的三個按鈕,移至控制項的 [屬性] 視窗並設定水平及垂直對齊方式,置中對齊 (請參閱 圖 5),因此對齊向中心和視訊的播放程式的中間下按鈕。

圖 5設定按鈕控制項的對齊方式

按鈕是預設的大小,而且介於彼此的頂端。設定每個按鈕的寬度 400,並以 75 高度。接下來,調整邊界,讓一個按鈕都有一個 175 像素位移,從另一個 175 像素位移,從頂端下方和最後一個有完全沒有邊界的位移。最後的結果會看起來像 圖 6.

圖 6融合在運算式中的 [置中對齊] 按鈕

若要確認已經正確地放置播放程式上的按鈕,儲存所有開啟的檔案中運算式調和並回到 [Visual Studio。Visual Studio 可能會提示您重新載入運算式調和已變更的文件。如果看到此訊息,按一下 [確定]。從 Visual Studio 內按下 F5 以重新啟動在偵錯模式中的 SMF 玩家]。播放程式現在應該會出現與視訊螢幕的中央對齊,如 所示的三個按鈕圖 7.

圖 7SMF 播放程式中的 [置中對齊] 按鈕

事件處理常式攔截

事件處理常式必須現在與按鈕相關聯。若要從程式碼參考按鈕,您需要將名稱指派給它們,要透過在 [屬性] 索引標籤中的 [名稱] 文字方塊中這麼做。為了簡單起見,命名 [Button1]、 [Button2] 和 [Button3 按鈕]。當您 ’re 完成,[物件時間軸視窗應該更新的並在視覺樹狀結構中顯示相鄰按鈕圖示按鈕名稱。

針對每個按鈕的 [屬性] 索引標籤內找到用來指派視覺化元件的事件處理常式的事件] 按鈕。選取其中一個按鈕,按一下 [屬性] 索引標籤內的 [事件] 按鈕並連按兩下 [按一下文字方塊,以自動產生事件處理常式內 [MainPage.xaml.cs。每個按鈕的 [屬性] 視窗會現在有指派給其 Click 事件的事件處理常式 (請參閱 圖 8),而且 MainPage.xaml.cs 檔案的事件處理常式指派給每個按鈕 ’s Click 事件。

圖 8 設定事件處理常式

您現在可以偵錯在播放程式。按一下 [在螢幕上按鈕其中任何一個,會引發現在由自動產生] 方法內 MainPage.xaml.cs 所處理的 Click 事件。

建議的視訊

現在 let’s 使用這些按鈕來啟用建議的視訊功能。下列 XML 將代表建議:

<?xml version="1.0" encoding="utf-8" ?>
<Suggestions>
  <Suggestion DisplayName="A suggestion" Url=""/>
  <Suggestion DisplayName="Another suggestion" Url=""/>
  <Suggestion DisplayName="My final suggestion" Url=""/>
</Suggestions>

URL 屬性的值會指定的視訊播放程式就是當按下按鈕時載入,DisplayName 屬性為按鈕上寫入文字。 將此檔案儲存成名稱 Suggestions.xml SMFPlayerTest.Web 專案中。

下載 XML 文件,並代表內容型別安全的方式,將會使用 DataClient 類型 Microsoft.SilverlightMediaFramework.Data 命名空間中) 內。 若要表示從 XML 檔案以強型別的方式讀取每個建議,建立類別,稱為 SMFPlayerTestSuggestion Silverlight 專案中:

namespace SMFPlayerTest {
  public class SMFPlayerTestSuggestion {
    public string DisplayName;
    public Uri Url; 
  }
}

像 SettingsBase 的 DataClient 被為了讓強型別的表示從 XML 內容 (這種情況下物件的陣列 SMFPlayerTestSuggestion) 資料的類別所衍生自。

建立稱為 SMFPlayerTestDataClient SMFPlayerTest 專案內的另一個類別檔案:

namespace SMFPlayerTest {
  public class SMFPlayerTestDataClient : 
    DataClient<SMFPlayerTestSuggestion[]> {

    public SMFPlayerTestDataClient(Uri Url) : base(Url) { }

    protected override void OnRequestCompleted(
      object sender, SimpleEventArgs<string> e) {

      throw new NotImplementedException();
    }
  }
}

SMFPlayerTestDataClient 繼承自 DataClient,並將其樣板引數設為 SMFPlayerTestSuggestion 型別的陣列。 DataClient 基底類別會提供所有必要非同步網路邏輯,以便連線且下載外部的 XML 檔案。 一旦下載內容但是,DataClient 基底將會叫用 OnRequestCompleted 並預期的 XML 資料,然後進行的所有處理。 亦即 DataClient 基底類別下載之內容,但是實作器會負責執行與它的東西。

這裡 ’s OnRequestCompleted 的一個更完整的實作:

protected override void OnRequestCompleted(
  object sender, SimpleEventArgs<string> e) {

  XDocument doc = XDocument.Parse(e.Result);
  List<SMFPlayerTestSuggestion> suggestions = 
    new List<SMFPlayerTestSuggestion>();
  foreach (XElement element in doc.Descendants("Suggestion")) {
    suggestions.Add(new SMFPlayerTestSuggestion {
      DisplayName = element.Attribute("DisplayName").GetValue(),
      Url = element.Attribute("Url").GetValueAsUri()
    });
  }

  base.OnFetchCompleted(suggestions.ToArray()); 
}

這是因為的簡易性,我此實作中使用 LINQ to XML 剖析所需的項目和 XML 中的屬性。 一旦擷取 DisplayName 和 URL] 屬性值,從每個建議節點 SMFPlayerTestSuggestion 物件執行個體化,並指派值。

最後一個步驟是 OnFetchCompleted 事件的引動過程。 外 SMFPlayerTestDataClient 消費者可能註冊 FetchCompleted 事件,下載建議的視訊資料時收到通知的事件處理常式。 因為 OnRequestCompleted 有封裝 XML 資料型別安全方式在每個事件處理常式會收到一個方便的另一個則用於 XML 文件下載 DataClient 基底類別中的每個建議元素的 SMFPlayerTestSuggestion 物件陣列。

基礎 DataClient 提供一種方法稱為擷取的一次叫用會開始以非同步方式下載內容的程序。 若要開始下載建議資料,當影片結束時,將附加 MediaElement 物件上呼叫 mediaElement_MediaEnded MediaEnded 事件的事件處理常式:

void mediaElement_MediaEnded(
  object sender, RoutedEventArgs e) {

  m_client = new SMFPlayerTestDataClient(
    new Uri("http://localhost:10205/Suggestions.xml"));
  m_client.FetchCompleted += 
    new EventHandler<SimpleEventArgs<
    SMFPlayerTestSuggestion[]>>(m_client_FetchCompleted);
  m_client.Fetch(); 
}

mediaElement_MediaEnded 方法會建立 SMFPlayerTestDataClient 型別的執行個體、 將另一個事件處理常式指派給 FetchCompleted] 事件,並接著會叫用擷取] 開始下載程序。 FetchCompleted 處理常式會叫用由 OnFetchCompleted OnRequestCompleted (這會叫用由 DataClient 基底型別,一旦有下載內容) 內先前實作來呼叫。

註冊 mediaElement_MediaEnded,內的 suggestion_FetchCompleted 實作採用的建議 data 強型別的陣列,然後將一個建議指派給每個按鈕:

void m_client_FetchCompleted(
  object sender, SimpleEventArgs<
  SMFPlayerTestSuggestion[]> e) {
  for (int c = 1; c <= 3; c++) {
    Button btn = (Button)GetTemplateChild(
      "Button" + c.ToString());
    btn.Tag = e.Result[c - 1].Url;
    btn.Content = 
      e.Result[c - 1].DisplayName; 
  }
}

GetTemplateChild 基礎 FrameworkElement 型別中的方法取得每個按鈕 MainPage XAML 中定義的參考。 針對每個按鈕顯示的文字指派給 Content 屬性,URI 指派至標籤屬性]。 每個按鈕 ’s 按一下事件處理常式可以然後提取從 Tag 屬性 URI,並將 URL 指派給玩家 ’s MediaElement 播放資料流:

private void Button1_Click(
  object sender, System.Windows.RoutedEventArgs e) {

  Uri redirectUrl = (Uri)((Button)sender).Tag;
  myPlayer.MediaElement.SmoothStreamingSource = 
    redirectUrl; 
}

顯示按鈕

最後一個步驟是隱藏按鈕,直到已結束目前資料流視訊,在哪一個點按鈕成為可見。 一旦使用者按下一個] 按鈕,按鈕會再次隱藏。

Visual Studio 內以編輯 SMFPlayer 類別裝潢與兩個 TemplateVisualState 屬性:

[TemplateVisualState(Name = "Hide", GroupName = "SuggestionStates")]
[TemplateVisualState(Name = "Show", GroupName = "SuggestionStates")]
public class SMFPlayer : Player

TemplateVisualState 是 fascinatingly 強大的屬性,定義在其下的物件可能存在的視覺化狀態。Silverlight 一旦可見狀態會變成使用中,將會更新依指示屬於該類別的視覺元素的屬性 — 例如子按鈕控制項的可視性。

若要設定目前的視覺化狀態,使用 VisualStateManager 類別 (原生 Silverlight 類型) 的靜態的 GoToState 方法。TemplateVisualState 群組像狀態在而 [TemplateVisualState] 的 [名稱] 屬性指定個別狀態一起的群組名稱屬性。

回到運算式調和。在 [myPlayer] 範本按一下 myPlayer 直接上面設計工具視窗然後按一下 [編輯樣板] | 目前編輯。按一下 [狀態] 索引標籤及向 SuggestionStates 所示下捲動圖 9.

圖 9SuggestionStates 的視覺狀態

由屬性所建立的兩個 SuggestionStates 顯示為隱藏和顯示。如果您按一下隱藏,只為了在左邊會顯示紅色的圓形表示運算式調和正在錄製設計工具內所做的任何屬性變更。運算式調和繼續記錄屬性變更,直到隱藏再按一下,使得紅色錄製圓圈來消失。

將運算式調和與主動錄製隱藏視覺狀態按鈕] 設定為摺疊。選取 [物件與時間軸] 下的所有三個按鈕視窗,然後選擇 [摺疊],請為其在 [屬性] 索引標籤中的可見性。停止錄製的隱藏視覺狀態依序按一下 [隱藏] 按鈕再一次。現在請按一下放映,放映的視覺狀態的左邊會出現紅色的圓圈。這次明確會記錄為可見度狀態看得見按一下可見度下拉式右邊的 [進階屬性選項] 按鈕,並選取記錄目前值。儲存所有開啟的文件,並再次回到 Visual Studio。

原生 Silverlight 類別 VisualStateManager,用來明確地設定目前作用中的可見狀態。從玩家的 OnApplyTemplate 方法內設定隱藏目前作用中的可見狀態為:

VisualStateManager.GoToState(this, "Hide", true);

內 suggestion_FetchCompleted,設定顯示為目前作用中狀態,以顯示按鈕時,資料流已結束,並建議資料下載完畢後:

VisualStateManager.GoToState(this, "Show", true);

若要隱藏按鈕,一旦按下按鈕 (或重新執行原始資料流),建立新的事件處理常式 MediaElement ’s MediaOpened 事件,並將視覺狀態設定為 [隱藏]。

啟動和偵錯在播放程式最後一次。 您看到按鈕直到非常結束視訊此時他們就可以看見的是不可見。 按下按鈕巡覽 URL 是任何的玩家按鈕 ’s 相對應的建議設定中指定。

Codeplex SMF 專案空間可讓您存取程式碼基底]、 [文件]、 [討論區] 及 [問題追蹤。 請看並促成您可以。 更有創意的心智套用到該專案的每個人的愈好結果。

Ben Rush 是 18 年 veteran 軟體開發人員,在 Microsoft.NET Framework 珍貴和相關的 Microsoft 技術。他喜歡智慧的程式碼,並快速單車 rides。