1

ビデオをXNAゲームエンジンに最初にマージし、拡張リアリティコンテンツを追加してレンダリングされたコンテンツを別のユーザーにストリームするアプリケーションを作成しようとしています。このすべては、リアルタイムまたはほぼリアルタイムで発生する必要があります。 > XNA(ゲーム) - - >(???) - >表現エンジン - >ライブストリーム - >ネットワーク - >クライアントライブエンハンストリアリティフィードのExpression Engine SDKを使用したXNAのストリーミング

にクリーンでエレガントな方法を

ビデオ:基本的にシステムは、このようになります。これは、XNAのレンダリングされた出力をLiveDeviceSourceとして扱い、それを直接Expression EngineストリームJobに送ることです。カスタムLiveDeviceSourceなどを作成することは可能ですか?基本的に、誰かが表現エンジン用のカスタムソースを作成する方法を知っています。そこで、レンダリングされたXNAバッファをエンコーダに直接プッシュすることができますか?バッファをファイルにダンプして、それをエンコードするのはかなり簡単ですが、ディスクに書き込むのに必要な時間のために、ディスクへの書き込みには多大な遅延が発生することが懸念されます。

Expression Engineに出力ウィンドウのスクリーンキャプチャを実行させ、それをストリーミングさせます。私はスクリーンショットをキャプチャするためにExpression Engineを手に入れることができますが、ライブでストリーミングすることはできません。誰かが同時に両方をやり遂げる方法を提案することはできますか?

私はまだExpression Engine SDKに精通しているので、この質問はあまりうまくいきません。参考までに、私はXNA 4、MS Expression Engine 4、およびVisual Studio 2010を使用しています。私たちの目標は、このテクノロジを最終的にGoblin XNAのリリースに統合することです。

また、XNAから直接ライブビデオをストリーミングするための他の方法の提案もあります。私たちはExpression Engineと結婚していません。これまでのところ、最高のストリーミングソリューションであるようです(ffmpegに問題があります)。

答えて

0

ライブソースとして認識されるドライバを作成することで、パイプラインを完成させるためにAVStream miindriverを実装する必要があります。詳細はこちらhttp://msdn.microsoft.com/en-us/library/ff554228(v=VS.85).aspx DirectShowFilterまたはMFTフィルタを使用して書き込む方法がありますが、この部門の多く

私は式エンコーダsdkで作業しましたが、あなたがまだ尋ねてきたことに対する解決策に遭遇していません。ただし、画像データをExpression Encoderに簡単に転送することは可能です。 1つの方法は、レンダリングターゲットからバイトを取り出し、任意の方法(WCFはこのための良い選択です)で式エンコーダに転送し、ストリーミングに使用するビットマップにデータを再構築することです。

私は、Texture2D(したがってRenderTarget2D)のバイトデータを取得し、それらからBitmapオブジェクトを構築するための私のソースを入れました。

public static Bitmap ToBitmap(this Microsoft.Xna.Framework.Graphics.Texture2D rd, int Width, int Height) 
    { 
     var Bmp = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     byte[] data = ToBytes(rd); 

     var bmpData = Bmp.LockBits(new Rectangle(0, 0, rd.Width, rd.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

     System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length); 

     Bmp.UnlockBits(bmpData); 

     return Bmp; 
    } 

    public static byte[] ToBytes(this Microsoft.Xna.Framework.Graphics.Texture2D rd, byte[] data = null) 
    { 
     if (data == null || data.Length != 4 * rd.Height * rd.Width) 
      data = new byte[4 * rd.Height * rd.Width]; 

     rd.GetData<byte>(data); 

     SwapBytes(data); 

     return data; 
    } 

    private static void SwapBytes(byte[] data) 
    { 
     System.Threading.Tasks.ParallelOptions po = new System.Threading.Tasks.ParallelOptions(); 
     po.MaxDegreeOfParallelism = -1; 

     System.Threading.Tasks.Parallel.For(0, data.Length/4, po, t => 
     { 
      int bi = t * 4; 
      byte temp = data[bi]; 
      data[bi] = data[bi + 2]; 
      data[bi + 2] = temp; 
     }); 
    } 

    public static void FromBytes(this Texture2D texture, byte[] bytes) 
    { 
     SwapBytes(bytes); 

     texture.SetData<byte>(bytes); 
    } 

私は助けてくれることを願っています。

関連する問題