我查了一些资料,几乎都是从文件生成一个媒体播放实例,然后进行播放的。由于媒体的保密性,系统不能够在客户端生成临时文件。客户端程序通过网络从服务器上下载媒体数据,然后播放。文件不能够保存在硬盘。而是以流的形式进行播放。最好还要对应不同编码。请教各位大侠,给个方向

解决方案 »

  1.   

    想过,但是现在的总体方向是C/S
    不过如果有B/S结构可以做参考的话,也请不要吝啬。多谢
      

  2.   


    的确你说得不错,不是从天上掉下来的。我查到用DX进行媒体播放。当然,DX也是将文件读取到内存中,转换为媒体的数据流,之后再使用对应的算法进行解码,从而达到播放。但是我从网络上得到一个网络数据流,将这个数据流转换成媒体数据流之后,如何完成播放呢?Video videoTarget=new Video(fileName);需要一个文件名。从文件名进行播放。这里Video可以通过文件创建,但是无法通过媒体流创建啊。
      

  3.   

    你说的视频流应该是从流媒体服务器发送过来的吧,如果服务器是MMS协议的流,可用windows media player的控件传入视频的URL即可播放,要是其他协议的流似乎windows media server不支持,你需要自己去实现这些流媒体协议,或者你可以调用mplayer来播放,它支持的流媒体协议比较多.看看mplayer的手册即可.使用setParent API可以将mplayer嵌入你的程序里面,然后给它传入各种参数即可实现.
      

  4.   

    十分感谢。但是网络传输并不是现成的MMS协议的流,而是自己写的加密数据流。而且文件格式并不限制于Windows Media所支持的格式。可能是WMV,AVI也可能是RMVB,MKV。
    我会按照你给的方向先研究一下的。多谢。
      

  5.   

    已经加过密你还折腾个啥...再说一次...只要是在客户端能读取到的网络数据,你不可能阻止客户端保存它...就算你“不在客户端生成临时文件”也只是掩耳盗铃,内行用户仍然能够一点点地将整个媒体流抓取保存下来,当然能不能解密是另一回事...ps:如果你学过OS原理应该知道,文件的概念不是仅指磁盘上的一堆字节,内存中一样可以创建文件...更何况,流媒体播放器本来就是直接读取内存流的...又ps:要支持多种不同编码是由不得服务器的,需要客户端安装所有你可能用到的解码器...除非用户自己安装了万能解码器或暴风影音之类的...
      

  6.   


    你说得不错,资深的用户仍旧能够将媒体流抓取并且保存下来。但是由于我这是加密的流,并且通过类似PKI的方法进行身份验证。播放的时候还会利用内嵌的信息进行另一次身份验证。
    这样,就算用户可以取下未通过解密的媒体流,他也无法解密播放。就算得到了解密之后的流,也没有办法通过第二次身份验证。说实话,似乎距离问题中心越来越远了。如何从服务器得到加密流,如何进行身份验证,如何解密,这个都无关紧要。我现在就是要实现如何从媒体流进行视频播放。将问题简化一下:我现在要手动控制一个加密的视频文件,将其在内存中解密之后播放。解密之后的结果并不作为副本保存。有什么方法?说得再简单一点,现在能够播放视频:
    Video videoPlay=new Video([FileName]);
    有什么方法可以实现类似:
    Video videoPlay=new Video([NetStream]);既然媒体播放器也是通过读取内存流的,我如何将解密之后的内存流传递给播放器?
      

  7.   

    那要看你用什么播放器...例如WPF/Silverlight的MediaElement控件直接就支持MediaElement.SetSource(Stream)方法...
      

  8.   

    现在市场上比较多应用的是微软的DRM技术.
    lz需要的这种技术也很常见,如果说只是应用编码方面需求,很多常见控件都支持流播放的
      

  9.   

    如果想用VideoPlay直接播放,是有一定困难的。因为它的接口不允许定制。
    1.用reflector去分析VideoPlay的源代码,再结合反射之类的方法,看能否改变它的源代码来实现。
    2.直接调用windows的Encoder和Decoder,自己实现播放类。这个方法可能定制性更强。
    3.FFmpeg项目,就是专门做视频编解码的。大多数播放器,都是通过它实现。看能否封装ffmpeg来实现。
    4.抽象好ecoder接口,通过运行时检测客户端机器是否支持相应格式的编解码。如果不支持,就到服务器下载相应的解码器。ppstream就是这样做的。