SilverLight中MediaElement释放问题

tommir3 2009-09-17 10:30:51
现在的问题是,我在方法里创建的MediaElement,但在调用方法多次后会出现MediaError错误。
试了下,每次在调用124次时出现问题,可以为对象不释放问题,该怎样释放?
由于C#用的多了,习惯了垃圾回收,手动释放不太了解,望高人指教。
现在问题为这个,如再有问题的话,我会另开贴的,不吝啬分,望高人帮忙,谢啦~
...全文
364 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoguo827 2009-11-16
  • 打赏
  • 举报
回复
是这样,微软的silverlight的mediaelement如果连续创建125个会出现内存溢出错误,已经有人报告过这个问题了,我想你的问题跟那个有关系,建议尽量不要使用多过100个,话说你能用到125个也够夸张了。
xingjunli 2009-09-18
  • 打赏
  • 举报
回复

个人理解:
首先你的MedaiElement应该是全局共享的,当播放新的文件时更改其Source属性,重新加载播放而不是每次都new一个新的MediaElement
移除MediaElement也只是从可视树中移去然后交由托管代码释放资源(这个有一定延时的并不会马上释放)如:
  <Grid Name="grid">
<MediaElement Name="MediaPlayer" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="Auto" Height="Auto"

LoadedBehavior="Manual" />
</Grid>
	MediaElement tempMedia;
for (int i = grid.Children.Count-1; i >=0; i--)
{
tempMedia = grid.Children[i] as MediaElement ;
if (tempMedia!=null)
{

grid.Children.Remove(tempMedia);
}
}
tommir3 2009-09-18
  • 打赏
  • 举报
回复
尝试限制在应用程序中一次所具有的 MediaElement 对象的数量。如果应用程序树中的 MediaElement 对象超过一百个,则无论它们是否正在同时播放,都可能激发 MediaFailed 事件。解决这一问题的方法是在需要时向树中添加 MediaElement 对象,而在不需要时移除这些对象。

这是SilverLight的msdn上说的,不是我自己的程序这样,但怎么释放呢?
zhuzhi 2009-09-18
  • 打赏
  • 举报
回复
Silverlight对格式的支持确实有限,就是目前能够支持的这些格式也不是完整的支持,也是有限制的。

所以目前的Silverlight视频播放还不太成熟。你如果实在要播放MIDI格式,可以参考上面调用Windows Media Player 的方法。
zhuzhi 2009-09-18
  • 打赏
  • 举报
回复
silverlight有垃圾回收机制,会自动回收。你这个的原因不一定是内存释放问题,也可能是网络不稳定,多媒体文件突然断了一下。你可以考虑在代码里面用try catch,如果发现MediaError错误,就重新播放。
jv9 2009-09-17
  • 打赏
  • 举报
回复
另外一个方法:
对于MIDI格式,可以考虑调用HTML代码,调用Windows Media Player

<object id="Player" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" style="position:absolute;top:10px;width:64px;height:54px;" >
<param name="autoStart" value="false"/>
<param name="UImode" value="none"/>
<param name="stretchtofit" value="true"/>
<param name="volume" value="100"/>
<param name="Url" value="你的midi文件"/>
<param name="windowlessVideo" value="true"/>
</object>

HtmlPage.Window.Eval("parent.document.getElementById('Player').controls.play()");
jv9 2009-09-17
  • 打赏
  • 举报
回复
你可以跟踪一下倒124次调用为什么没有释放? 每次对象创建完,是不是你有重新new了一个新的实例在内存呢?
jv9 2009-09-17
  • 打赏
  • 举报
回复
1. MediaElement调用后可以remove的,每次不用手工操作的。

2. Silverlight不支持MIDI格式,如果需要播放,只能在内存中进行重新编码为MP3,才能播放。
tommir3 2009-09-17
  • 打赏
  • 举报
回复
我用的是音频,补充下,SL中支持MIDIG格式吗?如果不支持,该怎样让它播放MIDI,不要说转mp3等格式...

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧