[英]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/changesets和http://msdn.microsoft .COM / EN-US /庫/ cc190669%28V = VS.95%29.aspx
我知道這不是你要求的,但你可以在WPF窗口內托管一個VLC ActiveX組件,然后使用該VLC控件連接到流並顯示流。 這就是我通過WPF進行流式處理的方式。
由於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.