百度空间 | 百度首页 
 
查看文章
 
WPF中使用Expression Encoder SDK开发流媒体
2009年08月20日 星期四 12:41

微软在09年的7月份发布Expression Encoder 3 的版本,相比版本2来看多了对Live Encoding Support;Redesigned profile support with full support for H.264 customization;Smooth Streaming;Encoding Multiple Sources Together;Encoding Multiple Sources Together等众多功能.

我今天要做的这个Ddmo就是把media文件或者webcam进行流编码!

在官方的SDK的demo中有一个流编码的实例位于C:\Program Files\Microsoft Expression\Encoder 3\SDK\Samples\Live (假设你的encoder的安装路径是C:\Program Files\Microsoft Expression\Encoder 3\),这个是个console的程序,我们把它改造一下让他跑到我们WPF的工程上去.

我从那个Console的Demo移植到WPF上相信任何WPF开发者都应该没有问题.我们和Expression Encoder 对比一下功能,它的视频输出预览做的不错,好那我们也添加这个功能吧.

每一个LiveJob类都有一个OutputPreviewWindow 它的结构为

Code
public class PreviewWindow : IDisposable
{
         // Methods
         public PreviewWindow(HandleRef parentWindow);
         public void Dispose();
         protected virtual void Dispose(bool disposing);
         public void SetSize(Size size);
         // Properties
         public HandleRef ChildWindow { get; }
         public bool Visible { get; set; }
}

我们就靠他来呈现我们的视频了.

WPF中要呈现WIN32的东东要用到HwndHost, Msdn中是这样描述它的:

"若要承载 Win32 窗口,请创建一个从 HwndHost 派生的类。重写 BuildWindowCore 方法并将 Win32 窗口创建为传递到该方法的父窗口的子级。"

是不是很简单呢!

现在我们来完成这个类的创建

Code
internal class PostViewHwndHost : HwndHost
{
    private LiveJob m_LiveJob;
    private PreviewWindow m_PreviewWindow;
    public PostViewHwndHost(LiveJob liveJob)
    {
        m_LiveJob = liveJob;
    }
    protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        m_PreviewWindow = new PreviewWindow(hwndParent);
        m_LiveJob.OutputPreviewWindow = m_PreviewWindow;
        return m_PreviewWindow.ChildWindow;
    }
    protected override void DestroyWindowCore(HandleRef hwnd)
    {
        m_PreviewWindow.Dispose();
    }
}

具体使用方法,例如Border1.Child = new PostViewHwndHost(LiveJob实例)

我们发现Expression Encoder 中还有一个预览,那就是webcam的预览.我们类比PostViewHwndHost来写一个PreviewHwndHost,唯一不同的是构造器的参数现在是LiveDeviceSource,因为LiveDeviceSource class中有一个PreviewWindow供我们使用


public class PreviewHwndHost : HwndHost
{
      private PreviewWindow m_PreviewWindow;
      private LiveDeviceSource m_LiveDeviceSource;
      public PreviewHwndHost(LiveDeviceSource liveDeviceSource)
      {
          m_LiveDeviceSource = liveDeviceSource;
      }
      protected override HandleRef BuildWindowCore(HandleRef hwndParent)
      {
          m_PreviewWindow = new PreviewWindow(hwndParent);
          m_PreviewWindow.Visible = true;
          m_LiveDeviceSource.PreviewWindow = m_PreviewWindow;
          return m_PreviewWindow.ChildWindow;
      }
      protected override void DestroyWindowCore(HandleRef hwnd)
      {
          m_PreviewWindow.Dispose();
      }
}

具体使用方法,例如Border2.Child = new PreviewHwndHost (LiveDeviceSource 实例)

可以run一下试试了哦.!


类别:Wpf | 添加到搜藏 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
1
2009年10月02日 星期五 01:12 | 回复
可以发布代码来看看么,eboy_83@126.com
 
2
2009年10月11日 星期日 17:47 | 回复
回复chuncn:上面不是有代码么???
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu