高分请教silverlight使用MediaElement播放字节流的问题,不够再加

sundotLei 2011-10-29 01:31:35
分数不够再加

我现在自定义了一个StreamSource类,名称为MyMediaStreamSource,继承 MediaStreamSource

流是从另外设备上通过socket发过来的, byte[];

不考虑解码问题,这些都已OK.



创建MediaSource

MyMediaStreamSource mediasource = new MyMediaStreamSource(stream); //这个stream是刚开始接收到的流
mediaElement1.SetSource(mediasource);
mediaElement1.Play();

OK,这里都是正常的,能够播放最开始接收到的音频. 但是音频在不断接收,我需要不断的给mediasource中的stream填充.

当第二次数据过来时.

mediasource.AddStream(stream);// AddStream是自定义的一个方法, stream是第二次收到的数据

问题来了,这样再次加进去的stream, mediaElement根本无法识别到.
找到解决办法:

mediaElement1.Pause(); //先暂停
mediasource.AddStream(stream);//
mediaElement1.Play(); //再播放

这样虽然能解决问题,但是当接收数据速度过快时,哪怕是缓冲区设大一点,总感觉这不是个好办法.

每填充一次数据就需要暂停再播放一次, 因为我的应用对实时音频要求高,不允许太多延时,所以填充数据速度很快.

也就是说在不停的暂停,播放....

所以请教有经验的朋友,这里有什么好的替代方案.

即然是流播放,肯定需要不断的往里添加收到的数据流。但是好像没找到任何这种方法.





...全文
391 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycg_893 2011-12-03
  • 打赏
  • 举报
回复
你试试流位置行不行,就是在添加新流时,记住最后的流位置,添加后将流位置移动至上次位置+1
asimplefire 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jv9 的回复:]
Silverlight的MediaStreamSource是异步的,预先缓存是播放大文件必须使用的。记得在微软官方看到过相关的例程,你可以下载看看:

http://archive.msdn.microsoft.com/ManagedMediaHelpers
[/Quote]
可以尝试一下这个,不过mediaElement的确在诸多方面不成熟,使用起来,很是郁闷!在WPF里有过相关烦恼的
fallincloud 2011-11-25
  • 打赏
  • 举报
回复
没怎么用过,不过我看了MediaStreamSource的类有几个保护的方法可以重载

ReportSwitchMediaStreamCompleted
和SwitchMediaStreamAsync你看看在这里能管用么
高明 2011-11-25
  • 打赏
  • 举报
回复
这个很强大。我用flash一直没搞出来
jv9 2011-11-25
  • 打赏
  • 举报
回复
Silverlight的MediaStreamSource是异步的,预先缓存是播放大文件必须使用的。记得在微软官方看到过相关的例程,你可以下载看看:

http://archive.msdn.microsoft.com/ManagedMediaHelpers
kakaniuren 2011-11-03
  • 打赏
  • 举报
回复
没做过这种,友情帮顶..
sundotLei 2011-11-01
  • 打赏
  • 举报
回复
没人知道么?
sundotLei 2011-10-31
  • 打赏
  • 举报
回复
自已顶一下

8,737

社区成员

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

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