mobile 中调用播放器只有声音没图像 没做过.但你这没载体啊this.Controls.Add(m),看看; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用DirectShowWMPLib不行只能播放声音的 以下是我以前做过的预研文档DirectShow组件在“C:\windows\system32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。在转换过程中需要使用FrameWork SDK自带的TlbImp.exe命令工具,该命令工具在“D:\vs2005\SDK\v2.0\Bin”目录下(取决于Visual Studio 2005的安装路径)。 该命令的使用方法为: TlbImp "C:\WINDOWS\system32\quartz.dll" /out:”D:\DirectShow.dll” 如图:在工程中引用“D:\DirectShow.dll”;再利用DirectShow.FilgraphManagerClass类进行操作;以下是DirectShow接口说明: 接口名称 说明 IFilterGraph 过滤通道接口 IFilterGraph2 增强的IfilterGraph IGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager IMediaControl 用来控制流媒体(如流的启动和停止暂停等)播放控制接口 IMediaEvent 播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序 IMediaEventEx 扩展播放事件窗口 IMediaPosition 播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式) IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放 IBasicAudio 声音控制接口 IBasicVideo 图像控制接口(波特率,宽度,长度等信息) IVideoWindow 显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等) ISampleGrabber 捕获图像接口(可用于抓图控制) IVideoFrameStep 控制单帧播放的接口 最后释放接口。开发人员在调式播放器的时候切勿在播放媒体文件过程中点击VS中的停止调试,这样的话会释放不了接口,会导致下次无法播放。 /// <summary> /// 提供 Mp3,Mp4 播放的类 /// </summary> public class MediaPlayer { private const int WM_GRAPHNOTIFY = 0x00008001; private const int WS_CHILD = 0x40000000; private const int WS_CLIPCHILDREN = 0x02000000; private const int WS_CLIPSIBLINGS = 0x04000000; public event EventHandler EndPlayEvent; #region 局部变量 private FilgraphManagerClass m_FMC; private IntPtr m_HWND; private Timer m_Timer; private bool m_IsVideo; #endregion #region PlayState public enum PlayState { Stopped, Paused, Running }; #endregion #region OABool /// <summary> /// From #define OATRUE/OAFALSE, /// bools in .NET use 1, not -1 /// </summary> public enum OABool { /// <summary> /// Value = 0 /// </summary> False = 0, /// <summary> /// Value = -1 /// </summary> True = -1 } #endregion #region WindowStyle /// <summary> /// From WS_* defines /// </summary> [Flags] public enum WindowStyle { Overlapped = 0x00000000, Popup = unchecked((int)0x80000000), // enum can't be uint for VB Child = 0x40000000, Minimize = 0x20000000, Visible = 0x10000000, Disabled = 0x08000000, ClipSiblings = 0x04000000, ClipChildren = 0x02000000, Maximize = 0x01000000, Caption = 0x00C00000, Border = 0x00800000, DlgFrame = 0x00400000, VScroll = 0x00200000, HScroll = 0x00100000, SysMenu = 0x00080000, ThickFrame = 0x00040000, Group = 0x00020000, TabStop = 0x00010000, MinimizeBox = 0x00020000, MaximizeBox = 0x00010000 } #endregion //属性 #region Rate /// <summary> /// 获取或设置播放速度(部分媒体文件会不支持) /// </summary> public double Rate { get { return this.m_FMC.Rate; } set { this.m_FMC.Rate = value; } } #endregion #region Volume /// <summary> /// 获取或设置音量,范围( 最小值:-10000,最大值:0 ) /// </summary> public int Volume { get { return this.m_FMC.Volume; } set { this.m_FMC.Volume = value; } } #endregion #region State /// <summary> /// 获取当前播放状态 /// </summary> public PlayState State { get { try { int state; //获取状态 this.m_FMC.GetState(1000, out state); switch (state) { case 0: return PlayState.Stopped; case 1: return PlayState.Paused; case 2: return PlayState.Running; default: throw new Exception("unknown state!"); } } catch (Exception) { return PlayState.Stopped; } } } #endregion #region FullScreen /// <summary> /// 获取或设置窗口是否全屏播放 /// </summary> public OABool FullScreen { get { return (OABool)this.m_FMC.FullScreenMode; } set { if (m_IsVideo) //0x8004023a this.m_FMC.FullScreenMode = (int)value; } } #endregion #region CurrentPosition /// <summary> /// 获取或设置当前播放位置 /// </summary> public double CurrentPosition { get { return this.m_FMC.CurrentPosition; } set { this.m_FMC.CurrentPosition = value; } } #endregion #region Duration /// <summary> /// 获取或设置当前媒体文件的持续时间 /// </summary> public double Duration { get { return this.m_FMC.Duration; } } #endregion #region HWND /// <summary> /// 获取或设置播放窗口句柄 /// </summary> public IntPtr HWND { get { return m_HWND; } set { m_HWND = value; } } #endregion /// <summary> /// 构造函数 /// </summary> public MediaPlayer() { this.m_IsVideo = false; this.m_Timer = new Timer(new TimerCallback(m_Timer_Callback), null, Timeout.Infinite, 100); } #region m_Timer_Callback private void m_Timer_Callback(object state) { if (this.CurrentPosition == this.Duration) { this.Stop(); } } #endregion #region Play /// <summary> /// 播放 /// </summary> public void Play() { this.m_FMC.Run(); this.m_Timer.Change(0, 500); } #endregion #region Open /// <summary> /// 打开 /// </summary> /// <param name="bstrFileName">文件路径</param> public void Open(string bstrFileName) { this.m_FMC = new FilgraphManagerClass(); this.m_FMC.RenderFile(bstrFileName); this.m_FMC.NotifyOwnerMessage((int)this.HWND, WM_GRAPHNOTIFY, 0, 0); } #endregion #region Pause /// <summary> /// 暂停 /// </summary> public void Pause() { if (this.State == PlayState.Running) { this.m_Timer.Change(-1, -1); this.m_FMC.Pause(); } } #endregion #region Stop /// <summary> /// 停止 /// </summary> public void Stop() { this.m_Timer.Change(-1, -1); this.m_IsVideo = false; if (this.FullScreen == OABool.True) { this.FullScreen = OABool.False; } this.m_FMC.Stop(); this.m_FMC = null; GC.Collect(); if (EndPlayEvent != null) { this.EndPlayEvent(this, EventArgs.Empty); } } #endregion #region SetWindowPosition /// <summary> /// 设置视频播放窗口大小位置 /// </summary> /// <param name="left"></param> /// <param name="top"></param> /// <param name="width"></param> /// <param name="height"></param> public void SetWindowPosition(int left, int top, int width, int height) { try { this.m_FMC.Owner = (int)this.m_HWND; this.m_IsVideo = true; //设置视频播放窗口类型 this.m_FMC.WindowStyle = (int)(WindowStyle.Child | WindowStyle.ClipSiblings | WindowStyle.ClipChildren); this.m_FMC.SetWindowPosition(left, top, width, height); } catch { } } #endregion } VS中预览XML文件报无法显示 MDI窗体哪个控件效率高 物流运输线路问题 还谈面向对象 求一个c#条码打印的实例要源代码带效果的 ***一个比较难的转化网址的正则*** 高分提问关于update application block 如果实行多行删除 请问配置文件中访问oracle的字符串,如何设置等待时间 MSChart 数据绑定 B/S如何调用chm文件 c#中截图程序?求大侠帮忙
WMPLib不行只能播放声音的
在转换过程中需要使用FrameWork SDK自带的TlbImp.exe命令工具,该命令工具在“D:\vs2005\SDK\v2.0\Bin”目录下(取决于Visual Studio 2005的安装路径)。
该命令的使用方法为:
TlbImp "C:\WINDOWS\system32\quartz.dll" /out:”D:\DirectShow.dll” 如图:在工程中引用“D:\DirectShow.dll”;
再利用DirectShow.FilgraphManagerClass类进行操作;
以下是DirectShow接口说明:
接口名称 说明
IFilterGraph 过滤通道接口
IFilterGraph2 增强的IfilterGraph
IGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager
IMediaControl 用来控制流媒体(如流的启动和停止暂停等)播放控制接口
IMediaEvent 播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序
IMediaEventEx 扩展播放事件窗口
IMediaPosition 播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)
IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放
IBasicAudio 声音控制接口
IBasicVideo 图像控制接口(波特率,宽度,长度等信息)
IVideoWindow 显示窗口控制接口(有关播放窗口的一切控制,包括caption显示,窗口位置控制等)
ISampleGrabber 捕获图像接口(可用于抓图控制)
IVideoFrameStep 控制单帧播放的接口 最后释放接口。
开发人员在调式播放器的时候切勿在播放媒体文件过程中点击VS中的停止调试,这样的话会释放不了接口,会导致下次无法播放。
/// 提供 Mp3,Mp4 播放的类
/// </summary>
public class MediaPlayer
{
private const int WM_GRAPHNOTIFY = 0x00008001;
private const int WS_CHILD = 0x40000000;
private const int WS_CLIPCHILDREN = 0x02000000;
private const int WS_CLIPSIBLINGS = 0x04000000; public event EventHandler EndPlayEvent; #region 局部变量
private FilgraphManagerClass m_FMC;
private IntPtr m_HWND;
private Timer m_Timer;
private bool m_IsVideo;
#endregion #region PlayState
public enum PlayState
{
Stopped,
Paused,
Running
};
#endregion #region OABool
/// <summary>
/// From #define OATRUE/OAFALSE,
/// bools in .NET use 1, not -1
/// </summary>
public enum OABool
{
/// <summary>
/// Value = 0
/// </summary>
False = 0,
/// <summary>
/// Value = -1
/// </summary>
True = -1
}
#endregion #region WindowStyle
/// <summary>
/// From WS_* defines
/// </summary>
[Flags]
public enum WindowStyle
{
Overlapped = 0x00000000,
Popup = unchecked((int)0x80000000), // enum can't be uint for VB
Child = 0x40000000,
Minimize = 0x20000000,
Visible = 0x10000000,
Disabled = 0x08000000,
ClipSiblings = 0x04000000,
ClipChildren = 0x02000000,
Maximize = 0x01000000,
Caption = 0x00C00000,
Border = 0x00800000,
DlgFrame = 0x00400000,
VScroll = 0x00200000,
HScroll = 0x00100000,
SysMenu = 0x00080000,
ThickFrame = 0x00040000,
Group = 0x00020000,
TabStop = 0x00010000,
MinimizeBox = 0x00020000,
MaximizeBox = 0x00010000
}
#endregion //属性 #region Rate
/// <summary>
/// 获取或设置播放速度(部分媒体文件会不支持)
/// </summary>
public double Rate
{
get
{
return this.m_FMC.Rate;
}
set
{
this.m_FMC.Rate = value;
}
}
#endregion #region Volume
/// <summary>
/// 获取或设置音量,范围( 最小值:-10000,最大值:0 )
/// </summary>
public int Volume
{
get
{
return this.m_FMC.Volume;
}
set
{
this.m_FMC.Volume = value;
}
}
#endregion #region State
/// <summary>
/// 获取当前播放状态
/// </summary>
public PlayState State
{
get
{
try
{
int state;
//获取状态
this.m_FMC.GetState(1000, out state);
switch (state)
{
case 0:
return PlayState.Stopped;
case 1:
return PlayState.Paused;
case 2:
return PlayState.Running;
default:
throw new Exception("unknown state!");
}
}
catch (Exception)
{
return PlayState.Stopped;
}
}
}
#endregion #region FullScreen
/// <summary>
/// 获取或设置窗口是否全屏播放
/// </summary>
public OABool FullScreen
{
get
{
return (OABool)this.m_FMC.FullScreenMode;
}
set
{
if (m_IsVideo) //0x8004023a
this.m_FMC.FullScreenMode = (int)value;
}
}
#endregion #region CurrentPosition
/// <summary>
/// 获取或设置当前播放位置
/// </summary>
public double CurrentPosition
{
get
{
return this.m_FMC.CurrentPosition;
}
set
{
this.m_FMC.CurrentPosition = value;
}
}
#endregion #region Duration
/// <summary>
/// 获取或设置当前媒体文件的持续时间
/// </summary>
public double Duration
{
get
{
return this.m_FMC.Duration;
}
}
#endregion #region HWND
/// <summary>
/// 获取或设置播放窗口句柄
/// </summary>
public IntPtr HWND
{
get { return m_HWND; }
set { m_HWND = value; }
}
#endregion /// <summary>
/// 构造函数
/// </summary>
public MediaPlayer()
{
this.m_IsVideo = false;
this.m_Timer = new Timer(new TimerCallback(m_Timer_Callback), null, Timeout.Infinite, 100);
} #region m_Timer_Callback
private void m_Timer_Callback(object state)
{
if (this.CurrentPosition == this.Duration)
{
this.Stop();
}
}
#endregion #region Play
/// <summary>
/// 播放
/// </summary>
public void Play()
{
this.m_FMC.Run();
this.m_Timer.Change(0, 500);
}
#endregion #region Open
/// <summary>
/// 打开
/// </summary>
/// <param name="bstrFileName">文件路径</param>
public void Open(string bstrFileName)
{
this.m_FMC = new FilgraphManagerClass(); this.m_FMC.RenderFile(bstrFileName); this.m_FMC.NotifyOwnerMessage((int)this.HWND, WM_GRAPHNOTIFY, 0, 0);
}
#endregion #region Pause
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
if (this.State == PlayState.Running)
{
this.m_Timer.Change(-1, -1);
this.m_FMC.Pause();
}
}
#endregion #region Stop
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
this.m_Timer.Change(-1, -1); this.m_IsVideo = false; if (this.FullScreen == OABool.True)
{
this.FullScreen = OABool.False;
} this.m_FMC.Stop();
this.m_FMC = null; GC.Collect(); if (EndPlayEvent != null)
{
this.EndPlayEvent(this, EventArgs.Empty);
}
}
#endregion #region SetWindowPosition
/// <summary>
/// 设置视频播放窗口大小位置
/// </summary>
/// <param name="left"></param>
/// <param name="top"></param>
/// <param name="width"></param>
/// <param name="height"></param>
public void SetWindowPosition(int left, int top, int width, int height)
{
try
{
this.m_FMC.Owner = (int)this.m_HWND; this.m_IsVideo = true; //设置视频播放窗口类型
this.m_FMC.WindowStyle = (int)(WindowStyle.Child | WindowStyle.ClipSiblings | WindowStyle.ClipChildren); this.m_FMC.SetWindowPosition(left, top, width, height);
}
catch
{ }
}
#endregion
}