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



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

680   5  

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 media element.

Я использовал сторонний компонент под названием 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) и System.Окна.dll (версии Silverlight), которые имеют одинаковые имена и одинаковые пространства имен, но являются разными типами. (Кто-то должен объяснить, почему у нас есть пространства имен для microsoft!)

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

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

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

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

Comments

    Ничего не найдено.