设为首页
收藏本站
027热线15007117091
 位置: 武汉软件网 >> 文章频道 >> C#资源 >> 网络摘抄 >> 正文 软件定制热线 15007117091  [2008-04-23 08:50:07]      "科能健康体检系统"完成  [2007-12-02 11:15:55]      文档镇守使最新版下载  [2007-12-02 11:13:22]      网站改版完成  [2007-12-02 11:11:40]
 
热门文章
 实力游资席位及私募持仓图...
 盘点激情床戏抢镜的10大影...
 英文三字趣味经
 14种智能化系统在医院的应...
 深入浅出 Linux命令行札记...
 十大免费服务器工具
 六大科技趋势将改变家庭健...
 53年林彪高岗密谋架空总理...
推荐文章
 实力游资席位及私募持仓图...
 盘点激情床戏抢镜的10大影...
 英文三字趣味经
 14种智能化系统在医院的应...
 深入浅出 Linux命令行札记...
 十大免费服务器工具
 六大科技趋势将改变家庭健...
 53年林彪高岗密谋架空总理...
相关文章
C# 实现Windows Media Encoder音视频捕捉
[ 作者:Admin     来源:武汉软件网     点击数:4736     更新时间:2007-12-18     文章录入:Admin
C# 实现Windows Media Encoder音视频捕捉     CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。

我的博客中讲述过WMS9,可以实现流媒体服务器,但没有WME(windows media encoder)的支持,总觉得缺少点什么,这里就讲述一下如何通过.net实现WME获取设备视频音频流,并推送到远程(本地当然可以)流媒体广播发布点。

一.下载了wme9的SDK,安装完毕:这一步主要体验一下WME能够实现那些功能。

读者可以自行安装试试。

二.创建.net winform Application,添加引用

using WMEncoderLib;

WMEncoderLib是一个assemble,通过它,我们可以方便实现WME的操作。

三.获取本地屏幕,并转换为视频信号

IWMEncSource SrcAud = SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO);
                IWMEncSource SrcVid 
= SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO);
                SrcAud.SetInput(
"Default_Audio_Device""Device""");
                SrcVid.SetInput(
"ScreenCapture1""ScreenCap""");

四.启动Encoder,推送到远程WMS服务器

                //Set up the push broadcast.
                IWMEncPushDistribution PushDist = (IWMEncPushDistribution)Encoder.Broadcast;
                
string strServerName = this.TB_ServerName.Text.Trim() + ":" + this.TB_Port.Text.Trim();
                
string strPubPoint = "TmpBroadCastPubPoint";
                
// Remove the publishing point when the broadcast is over.
                PushDist.AutoRemovePublishingPoint = true;
                
// Set the push distribution variables.
                PushDist.ServerName = strServerName;        
                PushDist.PublishingPoint 
= strPubPoint;
                
// PushDist.Template = strPubTemplate;
                
// Initialize the encoding process.
                Encoder.PrepareToEncode(true);

注意:在这里,直接推送到远程服务器,如果服务器不在同一域内,或在不可信任区域,推送时应该会需要验证用户名和密码。因此我们需要创建一个委托:

Encoder.OnAcquireCredentials += new _IWMEncoderEvents_OnAcquireCredentialsEventHandler(OnUserAuth);

public void OnUserAuth(string bstrRealm, string bstrSite, ref object pvarUser, ref object pvarPassword, ref object plFlags)
        
{
            pvarUser 
= "administrator";
            pvarPassword 
= "622316";
            plFlags 
= 4;
        }

五.到这里就差不多了,完整代码贴出来:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using WMEncoderLib;

namespace Project2
{
    
public partial class Form1 : Form
    
{
        
static bool bDone;
        
private WMEncoder Encoder;
        
public Form1()
        
{
            InitializeComponent();
            Encoder 
= new WMEncoder();
            Encoder.OnStateChange 
+= new _IWMEncoderEvents_OnStateChangeEventHandler(OnWmeStatusChange);
            Encoder.onError 
+= new _IWMEncoderEvents_onErrorEventHandler(Encoder_onError);
            Encoder.OnAcquireCredentials 
+= new _IWMEncoderEvents_OnAcquireCredentialsEventHandler(OnUserAuth);
        }


        
private void Btn_Start_Click(object sender, EventArgs e)
        
{
            
this.StartBroadCast();
        }


        
private void Btn_Close_Click(object sender, EventArgs e)
        
{
            
this.StopBroadCast();
        }


        
/// <summary>
        
/// 停止广播服务
        
/// </summary>

        public void StopBroadCast()
        
{
            
this.Encoder.Stop();
        }


        
/// <summary>
        
/// 启动广播服务
        
/// </summary>

        public void StartBroadCast()
        
{
            
if (Encoder != null)
            
{         
                
                
                
// Retrieve the source group collection.
                IWMEncSourceGroupCollection SrcGrpColl = Encoder.SourceGroupCollection;

                
// Add a source group to the collection.
                IWMEncSourceGroup SrcGrp = SrcGrpColl.Add("SG_2");
                
                IWMEncSource SrcAud 
= SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_AUDIO);
                IWMEncSource SrcVid 
= SrcGrp.AddSource(WMENC_SOURCE_TYPE.WMENC_VIDEO);
                SrcAud.SetInput(
"Default_Audio_Device""Device""");
                SrcVid.SetInput(
"ScreenCapture1""ScreenCap""");


                
// Choose a profile from the collection.
                IWMEncProfileCollection ProColl = Encoder.ProfileCollection;
                IWMEncProfile Pro;
                
for (int i = 0; i < ProColl.Count; i++)
                
{
                    Pro 
= ProColl.Item(i);
                    
if (Pro.Name == "Windows Media Video 8 for Local Area Network (384 Kbps)")
                    
{
                        SrcGrp.set_Profile(Pro);
                        
break;
                    }

                }


                
//Set up the push broadcast.
                IWMEncPushDistribution PushDist = (IWMEncPushDistribution)Encoder.Broadcast;

                
// Specify the push distribution variables, including the Windows Media
                
// server name, publishing point, and announcement files.
                string strServerName = this.TB_ServerName.Text.Trim() + ":" + this.TB_Port.Text.Trim();
                
string strPubPoint , = "TmpBroadCastPubPoint";
                
//string strPubTemplate = "AnotherPubPoint";
                
//string MyNSCFile = "\\localhost\test\MyPubPoint.nsc";
                
//string MyNSCURL = "\\localhost\MyPubPoint.nsc";
                
//string MyASXFile = @"C:InetpubwwwrootMyPubPoint.asx";

                
// Remove the publishing point when the broadcast is over.
                PushDist.AutoRemovePublishingPoint = true;
                
// Set the push distribution variables.
                PushDist.ServerName = strServerName;
               
                PushDist.PublishingPoint 
= strPubPoint;
                
// PushDist.Template = strPubTemplate;
                
// Initialize the encoding process.
                

                Encoder.PrepareToEncode(
true);
                
                
// Generate the announcement file.
                
//PushDist.GenerateMulticastInfoFile(MyNSCFile);
                
//PushDist.GenerateAnnouncementFile(MyNSCURL, MyASXFile);

                
// Start the encoding process.
                Encoder.Start();
                
// wmp.openPlayer("mms://LIH-M/test");
                this.wmp.URL = "mms://192.168.1.108/TmpBroadCastPubPoint";
            }

        }


        
public void OnUserAuth(string bstrRealm, string bstrSite, ref object pvarUser, ref object pvarPassword, ref object plFlags)
        
{
            pvarUser 
= "administrator";
            pvarPassword 
= "622316";
            plFlags 
= 4;
        }


        
public void Encoder_onError(int Result)
        
{
            
this.RTB_Error.Text = "运行状态:出错代码 " + Result + " 【" + Encoder.ErrorState.ToString() + "";
        }


        
public void OnWmeStatusChange(WMENC_ENCODER_STATE enumState)
        
{

            
switch (enumState)
            
{
                
case WMENC_ENCODER_STATE.WMENC_ENCODER_RUNNING:
                    RTB_Error.Text 
+= " 运行状态:Encoder正在运行";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_STOPPED:
                    
// TODO: Handle stopped state.
                    bDone = true;
                    RTB_Error.Text 
+= " 运行状态:Encoder已经停止";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_STARTING:
                    RTB_Error.Text 
+= " 运行状态:Encoder正在启动";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_PAUSING:
                    
// TODO: Handle pausing state.
                    RTB_Error.Text += " 运行状态:Encoder正在暂停";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_STOPPING:
                    
// TODO: Handle stopping state.
                    RTB_Error.Text += " 运行状态:Encoder正在停止";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_PAUSED:
                    
// TODO: Handle paused state.
                    RTB_Error.Text += " 运行状态:Encoder已暂停";
                    
break;

                
case WMENC_ENCODER_STATE.WMENC_ENCODER_END_PREPROCESS:
                    
// TODO: Handle end preprocess state.
                    RTB_Error.Text += " 运行状态:Encoder正在处理结束前操作";
                    
break;
            }


        }

    }

}

WME可以捕捉机器音频和视频等设备,如:摄像头,桌面,光驱,声卡,电视卡等等。因此我们可以通过它实现网上电视直播,视频、音频捕捉等等功能。有兴趣的话可以研究一下。


发表评论   告诉好友   打印此文  收藏此页  关闭窗口  返回顶部
  • 上一篇文章: Controlling the 3153 Hioki Hipot Device by using Serial and Parallel Port in C#

  • 下一篇文章: Pocket Streamer
  • ∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!)
     
     

    Copyright© 2001-2007 ICP备案号:鄂ICP备05027628号
    027-soft.com 武汉软件定制
    本站为武汉城市圈内企业提供管理软件开发,软件策划等服务
    发表、收集一些企业E化的实例及其经验等的资料与大家共享。
    希望大家多提意见,同时共同进步。

    | 页面执行时:0.283 毫秒