微软在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供我们使用
Code 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一下试试了哦.!