標籤:ssm 分享 ace library 指令 顯示 form 定義 end
媒體播放包括視頻播放和音頻播放,在開發Windows市集應用的過程中可以使用MediaElement控制項來播放視頻檔案和音頻檔案。本節將通過一個具體的樣本介紹如何使用MediaElement控制項來播放視頻檔案,以及如何控制MediaElement控制項中視頻的播放。
20.6.1 視頻載入
首先來看如何讀取一個視頻檔案並載入到MediaElement控制項中,在Visual Staudio 2012中建立一個Visual C++的Windows市集的空白應用程式項目,並命名為FileDemo。接下來開啟MainPage.xaml檔案,並在Grid元素中添加如下的代碼用於布局前台介面。
<StackPanel>
<Button x:Name="FileButton" Content="開啟檔案" FontSize="20" Margin="114,30,0,0" Click="FileButtonClick" Width="113" Height="53"></Button>
<MediaElement x:Name="Video" HorizontalAlignment="Left" Height="400" Margin="114,10,0,0" VerticalAlignment="Top" Width="780" AutoPlay="False"/>
</StackPanel>
在上面的代碼中,添加一個MediaElement控制項和一個"開啟檔案"按鈕。將MediaElement控制項命名為Video,使用此控制項播放載入的視頻檔案。"開啟檔案"按鈕用於通過檔案開啟選取器來選取視頻檔案。
布局了前台介面以後,接著開啟MainPage.xaml.cpp源檔案,並引用如下的標頭檔和命名空間:
#include "ppltasks.h"
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::Storage::Pickers;
using namespace Concurrency;
using namespace Windows::System;
在上面的代碼中,使用include關鍵字引用一個ppltasks.h標頭檔,然後使用using指令引用命名空間Windows::Storage、Windows::Storage::Streams、Windows::Storage::Pickers、Concurrency和Windows::System,在後面讀取視頻檔案的過程中,將會用到定義在這些標頭檔和命名空間內的類。
引用了上述的標頭檔和命名空間以後,接下來為"開啟檔案"按鈕添加單擊事件處理函數FileButtonClick。開啟MainPage.xaml.h標頭檔,並添加如下的代碼,用於聲明FileButtonClick函數和成員變數localFile。
private:
????//載入視頻檔案
????void FileButtonClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
private:
????//聲明成員變數localFile
????Windows::Storage::StorageFile^ localFile;
聲明了FileButtonClick函數以後,在MainPage.xaml.cpp源檔案中添加FileButtonClick函數的實現代碼,具體代碼如下所示:
//載入視頻檔案
void FileDemo::MainPage::FileButtonClick(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
????//建立檔案選取器
????FileOpenPicker^ openPicker =ref new FileOpenPicker();
????//設定視圖為縮圖
????openPicker->ViewMode = PickerViewMode::Thumbnail;
????//設定訪問的初始位置為視頻庫
????openPicker->SuggestedStartLocation = PickerLocationId::VideosLibrary;
????//設定可選取的檔案類型,允許播放的檔案類型
????openPicker->FileTypeFilter->Append(".mp4");
????openPicker->FileTypeFilter->Append(".avi");
????//顯示檔案選取器,選擇檔案
????create_task(openPicker->PickSingleFileAsync()).then([this](StorageFile^ file)
????{
????????//判斷是否已選擇檔案
????????if (file)
????????{
????????????localFile = file;
????????????//將檔案寫入到IRandomAccessStream流中
????task<IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then(
????????????????[this](IRandomAccessStream^ stream)
????????????{
????????????????if (stream)
????????????????{
????????????????????//讀取視頻檔案到 MediaElement控制項
????????????????????Video->SetSource(stream, localFile->ContentType);
????????????????}
????????????});
????????}
????});
}
在FileButtonClick函數中,首先建立一個FileOpenPicker類的對象openPicker,並將PickerViewMode枚舉中的枚舉成員Thumbnail賦值給openPicker對象的ViewMode屬性,設定檔案開啟選取器的視圖模式為縮圖模式。接著將PickerLocationId枚舉中的枚舉成員VideosLibrary賦值給openPicker對象的SuggestedStartLocation屬性,設定檔案開啟選取器的初始位置為視頻庫。然後使用openPicker對象的FileTypeFilter屬性得到檔案開啟選取器顯示的檔案類型集合,並調用Append函數將檔案類型".mp4"和".avi"添加到這個集合中。
接下來調用openPicker對象的PickSingleFileAsync函數選取單個檔案,並得到一個StorageFile類型的對象file。然後調用file對象的OpenAsync函數得到一個IRandomAccessStream類型的對象stream。當stream對象不為空白時,調用MediaElement控制項的SetSource函數將視頻檔案載入到此控制項中。
運行項目,單擊"開啟檔案"按鈕,並在檔案開啟選取器介面中選擇一個視頻檔案,前台介面的顯示效果20-8所示。
圖20-8載入視頻檔案
Win10系列:VC++媒體播放