C#畅谈“网络电视”
C#畅谈“网络电视”



以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。
今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……
一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。
我需要用到哪些方法?需要建几个类?
拿到一个项目的时候首先要分析我想大家都知道
主界面如下:

既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。
频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!
选择频道,频道下面就会有节目,节目类也随之而来。
这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:
public class TypeAChannel:ChannelBase
public class TypeBChannel:ChannelBase
频道基类(ChannelBase)代码如下:
//频道基类
public abstract class ChannelBase
{
//频道名称
public string ChannelName { get; set; }
//频道路径
public string Path { get; set; }
//节目列表,该频道上的所有节目列表
public List<TvProgram> TvList { get; set; }
//获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表
public abstract void Fetch();
//频道类型
public string Type { get; set; }
}
节目类(TvProgram)代码如下:
//节目类
public class TvProgram
{
//播出时间
public DateTime PlayTime { get; set; }
//早间档,午间档,晚间档
public string Shiduan { get; set; }
//节目名称
public string ProgramName { get; set; }
//视频路径
public string Path { get; set; }
}
接下来可以着手绑定treeView了。
首先先添加根节点:
private void LoadRootNode()
{
TreeNode mineNode = new TreeNode();
mineNode.Text = "我的电视台"; allNode.Text = "所有电视台"; treeView1.Nodes.Add(mineNode);
treeView1.Nodes.Add(allNode);
}
treeView里代码如下:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode selectNode = treeView1.SelectedNode;
if (selectNode.Level== && selectNode.Parent.Text=="所有电视台")
{
ChannelBase channel = (ChannelBase)selectNode.Tag;
channel.Fetch(); List<TvProgram> ProList = channel.TvList;
dataGridView1.DataSource = ProList;
}
}
接下来把LoadRootNode()方法在Load中调用一下:
private void Form1_Load(object sender, EventArgs e)
{
LoadRootNode();
ChannelManager manager = new ChannelManager();
manager.PareseXML();
Dictionary<string,ChannelBase> dic=manager.FullChannel;
foreach (var channel in dic.Values)
{
TreeNode tn = new TreeNode();
tn.Text = channel.ChannelName;
tn.Tag = channel;
allNode.Nodes.Add(tn);
}
}
到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?
没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:
if (channel.TvList != null)
{
channel.TvList.Clear();
}
正确的代码如下:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode selectNode = treeView1.SelectedNode;
if (selectNode.Level== && selectNode.Parent.Text=="所有电视台")
{
ChannelBase channel = (ChannelBase)selectNode.Tag;
if (channel.TvList != null)
{
channel.TvList.Clear();
}
channel.Fetch(); List<TvProgram> ProList = channel.TvList;
dataGridView1.DataSource = ProList;
}
}
频道管理类:
//频道管理类
public class ChannelManager
{
public ChannelManager()
{
fullChannel = new Dictionary<string, ChannelBase>();
} private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>();
public Dictionary<string, ChannelBase> FullChannel
{
get { return fullChannel; }
set { fullChannel = value; }
}
public void PareseXML()
{
XmlDocument doc = new XmlDocument();
doc.Load("FullChannels.xml");
XmlNode root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
string type = node["channelType"].InnerText;
ChannelBase channel = ChannelFactory.CreatChannel(type);
channel.ChannelName = node["tvChannel"].InnerText;
channel.Path = node["path"].InnerText;
channel.Type = type; fullChannel.Add(channel.ChannelName,channel);
}
}
}
这里列举一个频道TypeAChannel类:
//A频道类
public class TypeAChannel:ChannelBase
{
//多态,覆盖父类的获取频道列表方法
public override void Fetch()
{
XmlDocument doc = new XmlDocument();
doc.Load("北京电视台.xml");
if (TvList == null)
{
TvList = new List<TvProgram>();
}
//获取根节点
XmlNode root = doc.DocumentElement;
foreach (XmlNode item in root.ChildNodes)
{
if (item.Name == "tvProgramTable")
{
foreach (XmlNode child in item.ChildNodes)
{
//一个item就是一个tvProgram节点
TvProgram program = new TvProgram();
program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);
program.Shiduan = child["meridien"].InnerText;
program.ProgramName = child["programName"].InnerText;
program.Path = child["path"].InnerText;
TvList.Add(program);
}
}
}
}
}
频道TypeBChannel类和TypeAChannel类一样。
至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:

右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。
那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。
C#畅谈“网络电视”的更多相关文章
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用
总是邮件.QQ什么的线上聊,让我们见面吧,不怕见光死,呵呵. 我和同事会先抛砖引玉,给大家介绍一下Autodesk几款最新的云技术和解决方案,然后大家就可畅所欲言,自由交流.来自五湖四海的人,为了 ...
- 基于vitamio的网络电视直播源码
这个项目是基于vitamio的网络电视直播源码,也是一个使用了vitamio的基于安卓的网络直播项目源码,可能现在网上已经有很多类似这样的视频播放应用了,不过这个还是相对来说比较完整的,希望这个案例能 ...
- 初识XML及简单工厂运用--网络电视精灵
网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...
- MAC 下使用ipv6、ipv4观看电视、网络电视
换了mac book,ipv6电视却看不了了,为了看电视,只要自己动手了. 关于ipv6是啥和哪里有ipv6这里就不说了,找度娘吧. 我们观看IPv6视频直播信号有两种,一种是mms协议,另外一种 ...
- 继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析
网络电视精灵 项目运行状态如图: 项目完成后的类: 首先,将程序分为二部分进行: 一:TreeView节点内容的设计及编写: 1.1遍写XML文件:管理(FullChannels.xml),A类电视台 ...
- 【转】2012年6月26 – PPS网络电视PHP工程师最新面试题
每一次面试都是一场较量,和面试官,更是和你自己! 前言:虽然面试职位是PHP工程师,但题目仅绝非限于PHP,甚至都没有多少PHP的题!inner peace!希望能给你带了一丝帮助. PPS网络电视面 ...
- 基于vitamio的网络电视直播源代码
这个项目是基于vitamio的网络电视直播源代码.也是一个使用了vitamio的基于安卓的网络直播项目源代码,可能如今网上已经有非常多类似这种视频播放应用了.只是这个还是相对来说比較完整的,希望这个案 ...
- 京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(下)
在上次推送的文章中(传送门),田琪老师分享了他的DockerCon 2015峰会见闻.在“QCon高可用架构群”中,田老师分享之后,几位专家也参与了讨论.他们是: 闫国旗:京东资深架构师,京东架构技术 ...
随机推荐
- 连接MySQL数据常见问题
错误信息1 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:YES) 错误信息2 :ER ...
- 学习 html5 需要学习的 基本 库
jquery backbone bootstrap underscore appframework require.js
- 新建maven project遇到的问题
在m2e安装成功之后,开始创建maven project了,但是出现了如下错误: 结果在很偶然的情况下让我解决了,就是更新下m2.respository,点击下图中的Update Settings -
- google yeoman
Yeoman是Google的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML.CSS.Javascript和图片等前端资源的包管 ...
- Delphi XE6 for Android 让手机震动(调用Java的函数)
震动,是调用了 安卓api JNI 里面的 函数 ,这些都是 调用java的 ,如下面的引用, uses FMX.Helpers.Android, Androidapi.JNI.App, A ...
- Mysql 数字类型转换函数
.将Int 转为varchar经常用 concat函数,比如concat(,' .将varchar 转为Int 用 cast(a as signed) a为varchar类型的字符串 总结:类型转换和 ...
- 吉哥系列故事――临时工计划(dp)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descr ...
- Tribles(概率)
Description Problem ATribblesInput: Standard Input Output: Standard Output GRAVITATION, n."Th ...
- 怎么添加项目到SVN上面
一.通过SVN客户端向服务器上面添加项目 1.在服务器上面创建一个文件夹,文件夹以项目名称命名. 2.在合适目录下右击后,点击SVN Checkout,将你在服务器上面创建的目录checkout下来 ...
- 动态规划——G 回文串
G - 回文串 Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...