web-dev-qa-db-ja.com

MediaElementを使用してストリームからビデオを再生する

WPF MediaElementを使用してSystem.IO.Streamオブジェクトからストリーミングビデオを再生することは可能ですか? Streamオブジェクトは、メディアファイルを格納するWCFサービスから取得されています。

9
rafale

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

もう1つのオプションは、何らかの方法でSilverlight MediaElementをホストし、ストリームを取得して再生できるSetSourceメソッドを使用することです... http:// silverlightviewportを参照してください。 codeplex.com/SourceControl/list/changesets および http://msdn.Microsoft.com/en-us/library/cc190669%28v=vs。 95%29.aspx

7
Yahia

手遅れかもしれませんが、まだ答えを探しているなら、これが役立つかもしれません。

はい、WPFメディア要素を使用してメモリストリームからビデオを再生できます。

ボックス化されたアプリと呼ばれるサードパーティのコンポーネントを使用しましたBoxedAppのおかげで100万 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();
    }
}

-箱入りアプリの場合は、サンプルに従ってください。それだけです。あなたは幸せな世界にいます...

QTPlayerでも同じです。

回答に基づいて、提供された情報が十分でない場合は、完全な例を追加します。

ハッピーコーディング....

14
user1108125

誰かが自分でこれを見つけるのに時間を浪費する前に:WPFアプリケーションでSilverlightMediaElementをホストすることは不可能です。これは、PresentationFramework.dll(WPFでは不可避)およびSystem.Windows.dll(Silverlightバージョン)に表示される、同じ名前と同じ名前空間を持つが、タイプが異なる多数のタイプの1つであるためです。 (Microsoftに名前空間がある理由を誰かが説明する必要があります!)

14
Robert

これはあなたが求めていたものではないことはわかっていますが、WPFのウィンドウ内でVLC ActiveXコンポーネントをホストし、そのVLCコントロールを使用してストリームに接続してストリームを表示できます。これが、WPFを介してストリーミングを機能させる方法です。

編集: このページには、WPF内でActiveXコントロールをホストする方法の例があります

5
stuartmclark

WPFmediaelementは内部的にWindowsMediaPlayerを使用するため。メディアプレーヤーのバッファ設定をデフォルトのバッファ設定からカスタムに変更した場合。 WindowsMediaPlayerツールオプションパフォーマンスを開きます。

「バッファ」オプションを選択し、「コンテンツの秒数」を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

0
somu