您需要实现一个 AVStream miindriver 以通过创建一个被识别为实时源的驱动程序来完成管道(在此处查找详细信息http://msdn.microsoft.com/en-us/library/ff554228(v=VS. 85).aspx ) 另一种解决方案是使用 DirectShowFilter 或 MFT 过滤器编写,但在这个部门我帮不了你太多。
我已经使用过表达式编码器 sdk,但我还没有遇到您所要求的解决方案。但是,您可以非常轻松地将图像数据传输到 Expression Encoder。一种方法是从渲染目标中检索字节并使用您喜欢的任何方式将它们传输到表达式编码器(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);
}
我希望我有所帮助。