基于FMS的流媒体播放程序,看山寨帮的山寨传奇

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://beniao.blog.51cto.com/389148/139285

 

 

     本文主要介绍怎么去创建基于FMS的流媒体播放程序,Flash客户端通过网络加载FMS服务器上的视频流文件(.flv,.mp4等),实现视频流的播放。

     要实现媒体流文件的播放是非常简单的,只要在FMS服务器上提供好流媒体文件,Flash客户端通过NetConnection连接到FMS服务器,然后通过NetStream加载就OK。关于怎么连接FMS在本系列的前两篇已有详细介绍,首先得在fms上建立好服务器应用并部署好媒体文件,如下图示:

          在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云 

 

     下面是在Flash中开发的流媒体文件播放示例程序:

 1 import flash.display.*;

 2 import flash.events.*;

 3 import flash.net.*;

 4 

 5 var nc:NetConnection = new NetConnection();

 6 var ns:NetStream;

 7 var video:Video;

 8 

 9 nc.connect("rtmp://localhost/PlayStreams");

10 nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

11 

12 function onStatusHandler(evt:NetStatusEvent):void

13 {

14     trace(evt.info.code);

15     if(evt.info.code=="NetConnection.Connect.Success")

16     {

17         ns=new NetStream(nc);

18         ns.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

19         ns.client=new CustomClient();

20         video=new Video();

21         video.attachNetStream(ns);

22         ns.play("2009031301",0);

23         addChild(video);

24     }

25 }

     看看上面的程序代码是不是非常简单,现在我对上面的代码进行详细的分析。程序从上到下思路很清晰,首先将程序中需要的相关包导入,然后定义了连接对象(NetConnection),流对象(NetStream)和视频对象(Video)。

     通过NetConnection的connect方法连接到fms服务器(rtmp://localhost/PlayStreams),并添加网络连接的事件处理函数,在此函数内判断网络连接状态,如果连接成功(连接状态:NetConnection.Connect.Success)则通过NetStream建立视频流,调用NetStream的play方法播放指定的流媒体文件,然后将流附加到视频对象并显示在flash界面上。如下图示:

          在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

     OK,我们已经实现了流媒体文件的播放,下面我们来扩展程序的功能,为前面的视频播放程序加上播放、暂停、停止以及重新播放等功能。这时可以在界面上放置几个按扭来驱动这些功能,添加按扭代码如下(当然也可以直接拖拽Botton组件):

 1 var btnPlay:Button=new Button();

 2 btnPlay.x=10;

 3 btnPlay.y=250;

 4 btnPlay.width=50;

 5 btnPlay.label="播放";

 6 btnPlay.addEventListener(MouseEvent.CLICK,onPlayHandler);

 7 addChild(btnPlay);

 8 

 9 var btnPause:Button=new Button();

10 btnPause.x=80;

11 btnPause.y=250;

12 btnPause.width=50;

13 btnPause.label="暂停";

14 btnPause.addEventListener(MouseEvent.CLICK,onPauseHandler);

15 addChild(btnPause);

16 

17 var btnStop:Button=new Button();

18 btnStop.x=150;

19 btnStop.y=250;

20 btnStop.width=50;

21 btnStop.label="停止";

22 btnStop.addEventListener(MouseEvent.CLICK,onStopHandler);

23 addChild(btnStop);

24 

25 var btnReplay:Button=new Button();

26 btnReplay.x=220;

27 btnReplay.y=250;

28 btnReplay.width=80;

29 btnReplay.label="重新播放";

30 btnReplay.addEventListener(MouseEvent.CLICK,onReplayHandler);

31 addChild(btnReplay);

32 

33 function onPlayHandler(evt:MouseEvent):void

34 {}

35 

36 function onPauseHandler(evt:MouseEvent):void

37 {}

38 

39 function onStopHandler(evt:MouseEvent):void

40 {}

41 

42 function onReplayHandler(evt:MouseEvent):void

43 {}

 

     这里我们需要对上面的代码进行一下重构,将流和控制视频播放的代码重构为方法,以便在重新播放的时候直接调用。

 

 1 function playStream():void

 2 {

 3     ns=new NetStream(nc);

 4     ns.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

 5     ns.client=new CustomClient();

 6     video=new Video();

 7     video.attachNetStream(ns);

 8     ns.play("2009031302",0);

 9     addChild(video);

10 }

 

     上面我们已经将控制视频播放、暂停、停止和重新播放的按扭构造在了flash界面上,现在只需要完成这些按扭的功能就是,要实现视频的播放、暂停、停止和重新播放同样是非常简单的,NetStream为我们提供了可直接调用的API。详细如下:

 1 function onPlayHandler(evt:MouseEvent):void

 2 {

 3     ns.resume();

 4 }

 5 

 6 function onPauseHandler(evt:MouseEvent):void

 7 {

 8     ns.pause();

 9 }

10 

11 function onStopHandler(evt:MouseEvent):void

12 {

13     ns.close();

14 }

15 

16 function onReplayHandler(evt:MouseEvent):void

17 {

18     ns.close();

19     playStream();

20 }

 

     一切搞定 ,可以按下Ctrl+Enter测试了,看到了flash已经成功的加载到了fms上的视频文件(.flv)。打开FMS管理控制台就会看到,在应用"PlayStreams"下有一个NetStream的连接,代表当前应用有一个网络流正在传输,如下图:

在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

 

在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

完整示例代码

 1在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云import flash.display.*;

 2在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云import flash.events.*;

 3在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云import flash.net.*;

 4在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云import fl.controls.*;

 5在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

 6在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var nc:NetConnection = new NetConnection();

 7在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var ns:NetStream;

 8在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var video:Video;

 9在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

10在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var btnPlay:Button=new Button();

11在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPlay.x=10;

12在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPlay.y=250;

13在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPlay.width=50;

14在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPlay.label="播放";

15在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPlay.addEventListener(MouseEvent.CLICK,onPlayHandler);

16在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云addChild(btnPlay);

17在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

18在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var btnPause:Button=new Button();

19在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPause.x=80;

20在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPause.y=250;

21在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPause.width=50;

22在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPause.label="暂停";

23在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnPause.addEventListener(MouseEvent.CLICK,onPauseHandler);

24在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云addChild(btnPause);

25在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

26在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var btnStop:Button=new Button();

27在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnStop.x=150;

28在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnStop.y=250;

29在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnStop.width=50;

30在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnStop.label="停止";

31在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnStop.addEventListener(MouseEvent.CLICK,onStopHandler);

32在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云addChild(btnStop);

33在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

34在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云var btnReplay:Button=new Button();

35在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnReplay.x=220;

36在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnReplay.y=250;

37在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnReplay.width=80;

38在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnReplay.label="重新播放";

39在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云btnReplay.addEventListener(MouseEvent.CLICK,onReplayHandler);

40在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云addChild(btnReplay);

41在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

42在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云nc.connect("rtmp://192.168.1.103/PlayStreams");

43在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

44在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

45在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function onStatusHandler(evt:NetStatusEvent):void

46在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

47在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    trace(evt.info.code);

48在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    if(evt.info.code=="NetConnection.Connect.Success")

49在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

50在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云        playStream();

51在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    }

52在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

53在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

54在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function playStream():void

55在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

56在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns=new NetStream(nc);

57在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);

58在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.client=new CustomClient();

59在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    video=new Video();

60在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    video.attachNetStream(ns);

61在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.play("2009031302",0);

62在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    addChild(video);

63在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

64在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

65在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function onPlayHandler(evt:MouseEvent):void

66在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

67在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.resume();

68在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

69在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

70在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function onPauseHandler(evt:MouseEvent):void

71在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

72在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.pause();

73在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

74在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

75在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function onStopHandler(evt:MouseEvent):void

76在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

77在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.close();

78在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

79在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

80在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云function onReplayHandler(evt:MouseEvent):void

81在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云{

82在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    ns.close();

83在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云    playStream();

84在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云}

85在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

86在这里添加日志标题FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇   - 沧海 - 飘忽的云

 

     如果在Flex环境下开发,更方便实现,详细本文就不做介绍了,核心代码和Flash里开发是一样的。

本文出自 “beniao” 博客,请务必保留此出处http://beniao.blog.51cto.com/389148/139285本文出自 51CTO.COM技术博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值