Использование MediaElement для воспроизведения видео из потока

можно ли использовать WPF MediaElement для воспроизведения потокового видео из системы.ИО.Объект Stream? Объект Stream извлекается из службы WCF, в которой хранятся файлы мультимедиа.

5 ответов


если вы можете заставить WCF доставить медиа-объект через http-URL (GET) тогда вы можете просто назначить этот 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/library/cc190669%28v=vs.95%29.aspx


Это может быть слишком поздно, Надеюсь, это может помочь, если вы все еще ищете ответ.

Да вы можете воспроизводить видео из потока памяти с помощью медиа-элемента WPF.

я использовал сторонний компонент под названием boxed app,миллион спасибо BoxedApp -http://www.boxedapp.com/boxedappsdk/

мне нужно немного обновить код, чтобы он работал для byte[]. Скопируйте приведенный ниже конструктор в класс CustomFileStream из BoxedApp

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.

на основе ответа я добавлю полный пример, если предоставленной информации недостаточно.

удачи в кодировании....


прежде чем кто-либо тратит часы, выясняя это для себя: невозможно разместить Silverlight MediaElement в приложении WPF. Причина этого в том, что это один из нескольких типов, которые появляются в PresentationFramework.dll (неизбежно для WPF) и системы.Окна.dll (версии Silverlight), имеющие одинаковые имена и одинаковые пространства имен, но разные типы. (Кто-то должен объяснить, почему у нас есть пространства имен для microsoft!)


Я знаю, что это не то, что вы просили, но вы можете разместить компонент ActiveX VLC внутри окна в WPF, а затем использовать этот элемент управления VLC для подключения к потоку и отображения потока. Вот как я получил потоковую работу через WPF.

Edit:на этой странице приведен пример размещения элемента управления ActiveX внутри WPF


как WPF mediaelement внутренне использует проигрыватель windows media. Если изменить настройки буфера медиаплеера с параметра буфера по умолчанию на пользовательский. Открытые окна медиа-плеер инструменты   варианты  производительности.

когда вы выбираете опцию " буфер "и устанавливаете" секунды содержимого " на 2. В разделе media player будут добавлены следующие значения реестра. HKEY_CURRENT_USER\программное обеспечение\Microsoft\MediaPlayer\настройки 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