簡體   English   中英

使用MediaElement從Stream播放視頻

[英]Using MediaElement to play video from Stream

是否可以使用WPF MediaElement從System.IO.Stream對象播放流式視頻? 正在從存儲媒體文件的WCF服務檢索Stream對象。

這可能為時已晚,希望如果您仍在尋找答案,這可能會有所幫助。

是的,您可以使用WPF媒體元素從內存流播放視頻。

我使用了一個名為盒裝應用程序的第三方組件, 感謝BoxedApp提供了一百萬 - http://www.boxedapp.com/boxedappsdk/

我必須稍微更新代碼以使其適用於byte []。 將以下構造函數從BoxedApp復制到CustomFileStream類

public CustomFileStream(byte[] data)
{
    _Stream = new MemoryStream(data);
    _Length = _Stream.Length;
    _data = data;
    _Offset = 0;
}

創建一個wpf應用程序並添加一個媒體元素和一個按鈕,然后復制下面的代碼

public MainWindow()
{
    BoxedAppSDK.NativeMethods.BoxedAppSDK_Init();

    InitializeComponent();
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    var MyFileStream = new CustomFileStream(File.ReadAllBytes(@"wildlife.wmv"));

    IntPtr ptr = BoxedAppSDK.NativeMethods.BoxedAppSDK_CreateVirtualFileBasedOnIStream(
            @"1.wmv",
            BoxedAppSDK.NativeMethods.EFileAccess.GenericWrite,
            BoxedAppSDK.NativeMethods.EFileShare.Read,
            IntPtr.Zero,
            BoxedAppSDK.NativeMethods.ECreationDisposition.New,
            BoxedAppSDK.NativeMethods.EFileAttributes.Normal,
            IntPtr.Zero,
            MyFileStream);

    using (new SafeFileHandle(ptr, true))
    {
        mediaElement1.Source = new Uri(Path.GetFullPath("1.wmv"));
        mediaElement1.LoadedBehavior = MediaState.Manual;
        mediaElement1.Play();
    }
}

- 對於盒裝應用程序,請關注樣本,就是這樣......你在一個快樂的世界......

對於QT Player來說也是如此。

根據響應,如果提供的信息不夠,我將添加一個完整的示例。

快樂的編碼....

在任何人浪費時間為自己找到它之前:在WPF應用程序中托管Silverlight MediaElement是不可能的。 原因是它是PresentationFramework.dll(不可避免的WPF)和System.Windows.dll(Silverlight版本)中出現的多種類型之一,它們具有相同的名稱和相同的名稱空間,但是類型不同。 (有人應該解釋為什么我們有微軟命名空間!)

如果您可以通過http-URL (GET)使WCF傳遞媒體對象,那么您只需將該URL分配給MediaElement.Source屬性 - 請參閱http://msdn.microsoft.com/en-us/library/system .windows.controls.mediaelement.source.aspx

對於此類URL不可用/可能的情況:

目前無法分配流 - 雖然有一些黑客可以實現這一點,但對於基於DirectShow的示例,請參閱http://social.msdn.microsoft.com/forums/en-US/wpf/thread/6191ef1a-0010 -4294-a5b4-451bbadca33a /http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/15/WPF-Hackery-Part-I.aspx

另一種選擇是以某種方式托管Silverlight MediaElement並使用SetSource方法,該方法可以獲取流並播放它...請參閱http://silverlightviewport.codeplex.com/SourceControl/list/changesetshttp://msdn.microsoft .COM / EN-US /庫/ cc190669%28V = VS.95%29.aspx

我知道這不是你要求的,但你可以在WPF窗口內托管一個VLC ActiveX組件,然后使用該VLC控件連接到流並顯示流。 這就是我通過WPF進行流式處理的方式。

編輯: 此頁面有一個如何在WPF中托管ActiveX控件的示例

由於WPF mediaelement內部使用Windows媒體播放器。 如果將媒體播放器的緩沖區設置從默認緩沖區設置更改為自定義。 打開Windows媒體播放器工具選項性能。

當您選擇“緩沖區”選項並將“內容的秒數”設置為2.以下注冊表值將添加到媒體播放器下。 HKEY_CURRENT_USER \\ Software \\ Microsoft \\ MediaPlayer \\ Preferences UseDefaultBufferTime = 0 CustomBufferTime = 2000

您可以使用dotnet注冊表類進行更改。 請參考此鏈接: https//social.msdn.microsoft.com/Forums/vstudio/en-US/1b4b8fb9-ff8f-4861-8e99-4a7a4fc75596/setting-windows-media-player-properties-in-wpf?forum= WPF#ac879a7f-37bc-4ccc-854d-ab6e047086e5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM