【200分求助】如何播放内存中的媒体流?

dyshadow 2010-11-19 03:50:57
我查了一些资料,几乎都是从文件生成一个媒体播放实例,然后进行播放的。

由于媒体的保密性,系统不能够在客户端生成临时文件。客户端程序通过网络从服务器上下载媒体数据,然后播放。

文件不能够保存在硬盘。而是以流的形式进行播放。最好还要对应不同编码。

请教各位大侠,给个方向。。。

...全文
369 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
solibear 2012-11-17
  • 打赏
  • 举报
回复
没有一个真正懂的,懂的话直接详细说出思路或解决办法就行了,偏偏不懂还要故作高深。
dyshadow 2010-12-10
  • 打赏
  • 举报
回复
难道说,顶了还沉啊?
大虾指教
mooniscrazy 2010-12-10
  • 打赏
  • 举报
回复
如果想用VideoPlay直接播放,是有一定困难的。因为它的接口不允许定制。
1.用reflector去分析VideoPlay的源代码,再结合反射之类的方法,看能否改变它的源代码来实现。
2.直接调用windows的Encoder和Decoder,自己实现播放类。这个方法可能定制性更强。
3.FFmpeg项目,就是专门做视频编解码的。大多数播放器,都是通过它实现。看能否封装ffmpeg来实现。
4.抽象好ecoder接口,通过运行时检测客户端机器是否支持相应格式的编解码。如果不支持,就到服务器下载相应的解码器。ppstream就是这样做的。
dyshadow 2010-12-02
  • 打赏
  • 举报
回复
沉了再顶
麦麦_同学 2010-11-26
  • 打赏
  • 举报
回复
每天回帖拿分
dyshadow 2010-11-26
  • 打赏
  • 举报
回复
帖子兄弟,别沉啊
LutzMark 2010-11-25
  • 打赏
  • 举报
回复
现在市场上比较多应用的是微软的DRM技术.
lz需要的这种技术也很常见,如果说只是应用编码方面需求,很多常见控件都支持流播放的
ahpanghupang 2010-11-25
  • 打赏
  • 举报
回复
路过 学习下 ,, 关注中
dyshadow 2010-11-25
  • 打赏
  • 举报
回复
帖子别沉啊
vrhero 2010-11-24
  • 打赏
  • 举报
回复
那要看你用什么播放器...例如WPF/Silverlight的MediaElement控件直接就支持MediaElement.SetSource(Stream)方法...
q12157138 2010-11-24
  • 打赏
  • 举报
回复
高深问题啊
dyshadow 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 vrhero 的回复:]
已经加过密你还折腾个啥...

再说一次...只要是在客户端能读取到的网络数据,你不可能阻止客户端保存它...就算你“不在客户端生成临时文件”也只是掩耳盗铃,内行用户仍然能够一点点地将整个媒体流抓取保存下来,当然能不能解密是另一回事...

ps:如果你学过OS原理应该知道,文件的概念不是仅指磁盘上的一堆字节,内存中一样可以创建文件...更何况,流媒体播放器本来就是直接读取内存流的...
……
[/Quote]

你说得不错,资深的用户仍旧能够将媒体流抓取并且保存下来。但是由于我这是加密的流,并且通过类似PKI的方法进行身份验证。播放的时候还会利用内嵌的信息进行另一次身份验证。
这样,就算用户可以取下未通过解密的媒体流,他也无法解密播放。就算得到了解密之后的流,也没有办法通过第二次身份验证。

说实话,似乎距离问题中心越来越远了。如何从服务器得到加密流,如何进行身份验证,如何解密,这个都无关紧要。我现在就是要实现如何从媒体流进行视频播放。

将问题简化一下:

我现在要手动控制一个加密的视频文件,将其在内存中解密之后播放。解密之后的结果并不作为副本保存。有什么方法?

说得再简单一点,现在能够播放视频:
Video videoPlay=new Video([FileName]);
有什么方法可以实现类似:
Video videoPlay=new Video([NetStream]);

既然媒体播放器也是通过读取内存流的,我如何将解密之后的内存流传递给播放器?
dyshadow 2010-11-23
  • 打赏
  • 举报
回复
别沉得太快!
vrhero 2010-11-23
  • 打赏
  • 举报
回复
已经加过密你还折腾个啥...

再说一次...只要是在客户端能读取到的网络数据,你不可能阻止客户端保存它...就算你“不在客户端生成临时文件”也只是掩耳盗铃,内行用户仍然能够一点点地将整个媒体流抓取保存下来,当然能不能解密是另一回事...

ps:如果你学过OS原理应该知道,文件的概念不是仅指磁盘上的一堆字节,内存中一样可以创建文件...更何况,流媒体播放器本来就是直接读取内存流的...

又ps:要支持多种不同编码是由不得服务器的,需要客户端安装所有你可能用到的解码器...除非用户自己安装了万能解码器或暴风影音之类的...
dyshadow 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 usabcd 的回复:]
楼主的问题没说完整。
很多控件都支持流媒体播放的。
你说的这个内存里的流,并不是天上掉下来的。也是从别处接收到的。
你说的不想存本地,那就是说客户端的机器要接受一个流。
这个流不是什么内存流,而是实实在在从网络上收到的流。
看下控件的使用例子,按常规的方式去做就行了。
没什么特别的。
[/Quote]

的确你说得不错,不是从天上掉下来的。我查到用DX进行媒体播放。

当然,DX也是将文件读取到内存中,转换为媒体的数据流,之后再使用对应的算法进行解码,从而达到播放。

但是我从网络上得到一个网络数据流,将这个数据流转换成媒体数据流之后,如何完成播放呢?

Video videoTarget=new Video(fileName);

需要一个文件名。从文件名进行播放。

这里Video可以通过文件创建,但是无法通过媒体流创建啊。
bu88dong 2010-11-22
  • 打赏
  • 举报
回复
learning...
dyshadow 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 vrhero 的回复:]
流媒体都是网络流、内存流...你所谓的“不能够在客户端生成临时文件”其实只是不在本地缓存而已...

然而,只要是网络流都无法防止客户端捕获数据并保存...你的方向就错了,你应该考虑流媒体加密...
[/Quote]

说实话,的确是加密的。由于项目机密,我不能够透露太多信息。十分抱歉。

服务器中保存的形式是加密的,网络传输的时候是加密的,最终播放前在内存中解密,然后播放。

是否能够给个大致的方向?十分感谢。
dyshadow 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xxiju203 的回复:]
你说的视频流应该是从流媒体服务器发送过来的吧,如果服务器是MMS协议的流,可用windows media player的控件传入视频的URL即可播放,要是其他协议的流似乎windows media server不支持,你需要自己去实现这些流媒体协议,或者你可以调用mplayer来播放,它支持的流媒体协议比较多.看看mplayer的手册即可.使用setParent API可以将mplayer嵌入你的……
[/Quote]
十分感谢。但是网络传输并不是现成的MMS协议的流,而是自己写的加密数据流。而且文件格式并不限制于Windows Media所支持的格式。可能是WMV,AVI也可能是RMVB,MKV。
我会按照你给的方向先研究一下的。多谢。
jerysab 2010-11-22
  • 打赏
  • 举报
回复
学习。。。。。。。。。。
vrhero 2010-11-22
  • 打赏
  • 举报
回复
流媒体都是网络流、内存流...你所谓的“不能够在客户端生成临时文件”其实只是不在本地缓存而已...

然而,只要是网络流都无法防止客户端捕获数据并保存...你的方向就错了,你应该考虑流媒体加密...
加载更多回复(6)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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