Quartz的简单使用,基于1.X(一)【入门及CronTrigger】

 什么是Quartz

Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:

    public void execute(JobExecutionContext context) throws JobExecutionException;

在Job接口实现类里面,添加需要的逻辑到execute()方法中。配置好Job实现类并设定好调度时间表,Quartz就会自动在设定的时间调度作业执行execute()。

整合了Quartz的应用程序可以重用不同事件的作业,还可以为一个事件组合多个作业。Quartz通过属性文件来配置JDBC事务的数据源、全局作业、触发器侦听器、插件、线程池等等。

Quartz是由James House创建并最初于2001年春天被加入sourceforge工程。接下来的几年里,有很多的新特性和版本出现,但是直到项目迁移到新的站点并成为OpenSymphony项目家族的一员,才开始真正启动并受到也有的关注。

目前的版本已经是2.0以上,v2.x相对于v1.x有很多新特性出现,并有很多的改动,具体参见Quartz官网上说明。

Job接口包含唯一方法execute(),将任务逻辑添加到该方法中。StdSchedulerFactory.getScheduler()返回一个可运行的实例,然后创建调度任务的JobDetail实例,并传递3个参数给构造方法。第一个参数是任务名,用于引用该任务。第二个参数是任务组名,这里使用默认名,任务组名用于引用集合起来的一组任务,如可以使用Scheduler.pauseJobGroup()来暂停一组任务,每个组中的任务名是唯一的。第三个参数是实现特定任务的类。创建JobDetail实例后,需要创建一个Trigger,这里使用的是SimpleTrigger类,它提供了JDK
Timer风格的触发器行为。传递给SimpleTrigger构造方法的两个参数分别是触发器名和任务组名,触发器名在它所在的任务组中必须是唯一的。接下来是设置触发器的一些属性,setStartTime()是设置启动时间,setRepeatInterval()是设置重复间隔,setRepeatCount()是设置重复次数。最后,scheduler.start()启动调度,终止调度可以用stop()方法。

1 、JobDetail : JobDetail 是一个具体的类。

2、Trigger :触发器,它用于定义 Job 何时执行。最常用的是 SimpleTrigger 和 CronTrigger 。一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么 SimpleTrigger 比较合适;如果你有许多复杂的作业调度,那么 CronTrigger 比较合适。 CronTrigger 和 Unix 的 cron 机制基本一样,我们需要的只是一个 cron 表达式。比如“ 0
0 12 * * ? ”会在每天中午 12 点触发 执行;“0 15 10 ? * 6L ”会在每个月的最后一个星期五的早上 10:15 触发 Job 执行。

3、 Scheduler 和 SchedulerFactory : Scheduler 负责管理 Trigger 、调度 Job , SchedulerFactory 则是 Scheduler 工厂,负责生成Scheduler 。

 "Hello,
Quartz"

  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. public class QuartzTest {
  4. /** *//**
  5. * @param args
  6. */
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9. SimpleDateFormat DateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
  10. Date d = new Date();
  11. String returnstr = DateFormat.format(d);
  12. TestJob job = new TestJob();
  13. String job_name ="11";
  14. try {
  15. System.out.println(returnstr+ "【系统启动】");
  16. QuartzManager.addJob(job_name,job,"0/2 * * * * ?"); //每2秒钟执行一次
  17. //            Thread.sleep(10000);
  18. //            System.out.println("【修改时间】");
  19. //            QuartzManager.modifyJobTime(job_name,"0/10 * * * * ?");
  20. //            Thread.sleep(20000);
  21. //            System.out.println("【移除定时】");
  22. //            QuartzManager.removeJob(job_name);
  23. //            Thread.sleep(10000);
  24. //
  25. //            System.out.println("/n【添加定时任务】");
  26. //            QuartzManager.addJob(job_name,job,"0/5 * * * * ?");
  27. }  catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

简单的任务管理类

[java] view
plain
 copy

  1. //简单的任务管理类
  2. //QuartzManager.java
  3. package quartzPackage;
  4. import java.text.ParseException;
  5. import org.quartz.CronTrigger;
  6. import org.quartz.Job;
  7. import org.quartz.JobDetail;
  8. import org.quartz.Scheduler;
  9. import org.quartz.SchedulerException;
  10. import org.quartz.SchedulerFactory;
  11. import org.quartz.Trigger;
  12. import org.quartz.impl.StdSchedulerFactory;
  13. /** *//**
  14. * @Title:Quartz管理类
  15. *
  16. * @Description:
  17. *
  18. * @Copyright:
  19. * @author zz  2008-10-8 14:19:01
  20. * @version 1.00.000
  21. *
  22. */
  23. public class QuartzManager {
  24. private static SchedulerFactory sf = new StdSchedulerFactory();
  25. private static String JOB_GROUP_NAME = "group1";
  26. private static String TRIGGER_GROUP_NAME = "trigger1";
  27. /** *//**
  28. *  添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
  29. * @param jobName 任务名
  30. * @param job     任务
  31. * @param time    时间设置,参考quartz说明文档
  32. * @throws SchedulerException
  33. * @throws ParseException
  34. */
  35. public static void addJob(String jobName,Job job,String time)
  36. throws SchedulerException, ParseException{
  37. Scheduler sched = sf.getScheduler();
  38. JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, job.getClass());//任务名,任务组,任务执行类
  39. //触发器
  40. CronTrigger  trigger =
  41. new CronTrigger(jobName, TRIGGER_GROUP_NAME);//触发器名,触发器组
  42. trigger.setCronExpression(time);//触发器时间设定
  43. sched.scheduleJob(jobDetail,trigger);
  44. //启动
  45. if(!sched.isShutdown())
  46. sched.start();
  47. }
  48. /** *//**
  49. * 添加一个定时任务
  50. * @param jobName 任务名
  51. * @param jobGroupName 任务组名
  52. * @param triggerName  触发器名
  53. * @param triggerGroupName 触发器组名
  54. * @param job     任务
  55. * @param time    时间设置,参考quartz说明文档
  56. * @throws SchedulerException
  57. * @throws ParseException
  58. */
  59. public static void addJob(String jobName,String jobGroupName,
  60. String triggerName,String triggerGroupName,
  61. Job job,String time)
  62. throws SchedulerException, ParseException{
  63. Scheduler sched = sf.getScheduler();
  64. JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass());//任务名,任务组,任务执行类
  65. //触发器
  66. CronTrigger  trigger =
  67. new CronTrigger(triggerName, triggerGroupName);//触发器名,触发器组
  68. trigger.setCronExpression(time);//触发器时间设定
  69. sched.scheduleJob(jobDetail,trigger);
  70. if(!sched.isShutdown())
  71. sched.start();
  72. }
  73. /** *//**
  74. * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
  75. * @param jobName
  76. * @param time
  77. * @throws SchedulerException
  78. * @throws ParseException
  79. */
  80. public static void modifyJobTime(String jobName,String time)
  81. throws SchedulerException, ParseException{
  82. Scheduler sched = sf.getScheduler();
  83. Trigger trigger =  sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
  84. if(trigger != null){
  85. CronTrigger  ct = (CronTrigger)trigger;
  86. ct.setCronExpression(time);
  87. sched.resumeTrigger(jobName,TRIGGER_GROUP_NAME);
  88. }
  89. }
  90. /** *//**
  91. * 修改一个任务的触发时间
  92. * @param triggerName
  93. * @param triggerGroupName
  94. * @param time
  95. * @throws SchedulerException
  96. * @throws ParseException
  97. */
  98. public static void modifyJobTime(String triggerName,String triggerGroupName,
  99. String time)
  100. throws SchedulerException, ParseException{
  101. Scheduler sched = sf.getScheduler();
  102. Trigger trigger =  sched.getTrigger(triggerName,triggerGroupName);
  103. if(trigger != null){
  104. CronTrigger  ct = (CronTrigger)trigger;
  105. //修改时间
  106. ct.setCronExpression(time);
  107. //重启触发器
  108. sched.resumeTrigger(triggerName,triggerGroupName);
  109. }
  110. }
  111. /** *//**
  112. * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
  113. * @param jobName
  114. * @throws SchedulerException
  115. */
  116. public static void removeJob(String jobName)
  117. throws SchedulerException{
  118. Scheduler sched = sf.getScheduler();
  119. sched.pauseTrigger(jobName,TRIGGER_GROUP_NAME);//停止触发器
  120. sched.unscheduleJob(jobName,TRIGGER_GROUP_NAME);//移除触发器
  121. sched.deleteJob(jobName,JOB_GROUP_NAME);//删除任务
  122. }
  123. /** *//**
  124. * 移除一个任务
  125. * @param jobName
  126. * @param jobGroupName
  127. * @param triggerName
  128. * @param triggerGroupName
  129. * @throws SchedulerException
  130. */
  131. public static void removeJob(String jobName,String jobGroupName,
  132. String triggerName,String triggerGroupName)
  133. throws SchedulerException{
  134. Scheduler sched = sf.getScheduler();
  135. sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器
  136. sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器
  137. sched.deleteJob(jobName,jobGroupName);//删除任务
  138. }
  139. }

测试工作类

[java] view
plain
 copy

  1. //测试工作类
  2. //TestJob.java
  3. package quartzPackage;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import org.quartz.Job;
  7. import org.quartz.JobExecutionContext;
  8. import org.quartz.JobExecutionException;
  9. public class TestJob implements Job {
  10. SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  11. Date d = new Date();
  12. String returnstr = DateFormat.format(d);
  13. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  14. // TODO Auto-generated method stub
  15. System.out.println(returnstr+"★★★★★★★★★★★");
  16. }
  17. }

CronTrigger类


Quartz有两大触发器,除了上面使用的SimpleTrigger外,就是CronTrigger。CronTrigger能够提供复杂的触发器表达式的支持。CronTrigger是基于Unix Cron守护进程,它是一个调度程序,支持简单而强大的触发器语法。

使用CronTrigger主要的是要掌握Cron表达式。Cron表达式包含6个必要组件和一个可选组件,如下表所示。


位置


含义


允许的特殊字符


1


秒(0~59)


, -  *  /


2


分(0~59)


, -  *  /


3


小时(0~24)


, -  *  /


4


日期(1~31)


, -  *  /  ?  L  W  C


5


月(JAN~DEC或1~12)


, -  *  /


6


星期(SUN~SAT或1~7)


, -  *  /  ?  L  C  #


7


年(可选,1970~2099),若为空,表示全部时间范围


, -  *  /

特殊字符的含义,见下表。


特殊字符


说明


*


通配符,任意值。‘*‘ 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。


?


无特定值。通常和其他指定的值一起使用,表示必须显示该值但不能检查。‘?‘
字符可以用在“日”和“周几”字段. 它用来指定 ‘不明确的值‘. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。


-


范围。e.g.小时部分10-12表示10:00,11:00, 12:00。‘-‘
字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点".


,


列分隔符。可以让你指定一系列的值。e.g.在星期域中指定MON、TUE和WED。‘,‘
字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".


/


增量。表示一个值的增量,e.g.分钟域中0/1表示从0开始,每次增加1min。‘/‘
字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和 45秒"。而 "5/15"则表示"第5, 20, 35, 和 50". 在‘/‘前加"*"字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。 因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”,
请注意其中微妙的差别。


L


表示Last。它在日期和星期域中表示有所不同。在日期域中,表示这个月的最后一天,而在星期域中,它永远是7(星期六)。当你希望使用星期中某一天时,L字符非常有用。e.g.星期域中6L表示每一个月的最后一个星期五。‘L‘字符可用在“日”和“周几”这两个字段。它是"last"的缩写,
但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天" —— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" —— 比如"6L"表示"该月最后一个周五"。当使用‘L‘选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。


W


在本月内离当天最近的工作日触发,所谓的最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离是0;所谓本月内指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日。e.g.
LW表示本月的最后一个工作日触发,W强烈依赖月份。‘W‘
可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五) 。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。‘W‘字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。‘L‘和‘W‘可以组合用于“日”字段表示为‘LW‘,意为"该月最后一个工作日"。


#


表示该月的第几个星期,e.g. 1#2表示每一个月的第一个星期一。‘#‘
字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" = 表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。


C


日历值。日期值是根据一个给定的日历计算出来的。在日期域中给定一个20C将在20日(日历包括20日)或20日后日历中包含的第一天(不包括20日)激活触发器。例如在一个星期域中使用6C表示日历中星期五(日历包括星期五)或者第一天(日历不包括星期五)。‘C‘
字符可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历, 那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"。

对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

Cron表达式举例:

"30 * * * * ?" 每半分钟触发任务

"30 10 * * * ?" 每小时的10分30秒触发任务

"30 10 1 * * ?" 每天1点10分30秒触发任务

"30 10 1 20 * ?" 每月20号1点10分30秒触发任务

"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务

"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务

"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务

"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务

"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务

"15-45 * * * * ?" 15到45秒内,每秒都触发任务

"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次

"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次

"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次

"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务

"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务

"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务

"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务

"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务

"0 0 12 * * ?"   每天中午十二点触发
"0 15 10 ? * *"   每天早上10:15触发
"0 15 10 * * ?"   每天早上10:15触发
"0 15 10 * * ? *"   每天早上10:15触发
"0 15 10 * * ? 2005"   2005年的每天早上10:15触发
"0 * 14 * * ?"   每天从下午2点开始到2点59分每分钟一次触发
"0 0/5 14 * * ?"   每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?"   每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?"   每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED"   三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI"   每个周一、周二、周三、周四、周五的10:15触发
"0 15 10 15 * ?"   每月15号的10:15触发
"0 15 10 L * ?"   每月的最后一天的10:15触发
"0 15 10 ? * 6L"   每月最后一个周五的10:15触发
"0 15 10 ? * 6L"   每月最后一个周五的10:15触发
"0 15 10 ? * 6L 2002-2005"   2002年至2005年的每月最后一个周五的10:15触发
"0 15 10 ? * 6#3"   每月的第三个周五的10:15触发

第三方包

通过测试。一个简单任务只需要以下几个包:commons-beanutils.jar、commons-collections.jar、commons-logging.jar、commons-digester.jar、quartz.jar即可

名称 必须/备注 网址
activation.jar 主要是 JavaMail 要用到 http://java.sun.com/products/javabeans/glasgow/jaf.html
commons-beanutils.jar http://jakarta.apache.org/commons/beanutils
commons-collections.jar http://jakarta.apache.org/commons/collections
commons-dbcp-1.1.jar 是,假如用到数据库作为作业存储 http://jakarta.apache.org/commons/dbcp
commons-digester.jar 假如你使用了某些插件,就需要它
commons-logging.jar http://jakarta.apache.org/commons/logging/
commons-pool-1.1.jar   http://jakarta.apache.org/commons/pool/
javamail.jar 发送 e-mail 用 http://java.sun.com/products/javamail/
jdbc2_0-stdext.jar 是,假如用到数据库作为作业存储 http://java.sun.com/products/jdbc/
jta.jar 是,假如用到数据库作为作业存储 http://java.sun.com/products/jta/database
quartz.jar Quart 框架核心包
servlet.jar 假如使用了Servlet 容器,但容器中应该存在 http://java.sun.com/products/servlet/
log4j.jar 是,日志 http://logging.apache.org/

时间: 2024-08-28 06:38:52

Quartz的简单使用,基于1.X(一)【入门及CronTrigger】的相关文章

基于Quartz实现简单的定时发送邮件

一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用提供服务,也可以和其他应用集成一起使用. 核心概念: 1.Job 表示一个工作,要执行的具体内容.此接口中只有一个方法 void execute(JobExecutionContext context) 2.JobDetail JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调

【Quartz】Quartz的简单搭建

Quartz在Java构建的系统中,是十分常用的定时任务框架. 本文,记录.介绍Quartz的简单入门的单独搭建(此文入门学习Quartz为主,并非基于Spring托管形式). > 参考的优秀资料 Quartz Quick Start Guide Chapter 3: Logback configuration > 版本说明 除了Quartz,还引入logback(为了看详细的日志嘛!) <dependencies> <dependency> <groupId&g

最简单的基于FFmpeg的AVDevice例子(读取摄像头)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/39702113 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] libavdevice使用 注意事项 代码 结果 下载 =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDevice例子(读取摄像头) 最简单的基于FFm

100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 简介 流程图 simplest_ffmpeg_player标准版代码 simplest_ffmpeg_player_suSU版代码 结果 FFMPEG相关学习资料 补充问题 ===================================================== 最简单的基于FFmp

最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0) 最简单的基于FFmpeg的解码器-纯净版(不包括libavformat) 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器 最简单的基于FFMPEG的Hellowor

最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

本文介绍一个最简单的基于FFMPEG的音频编码器.该编码器实现了PCM音频採样数据编码为AAC的压缩编码数据.编码器代码十分简单,可是每一行代码都非常重要.通过看本编码器的源码.能够了解FFMPEG音频编码的流程. 本程序使用最新版的类库(编译时间为2014.5.6).开发平台为VC2010.全部的配置都已经做好,仅仅须要执行就能够了. 流程(2014.9.29更新) 以下附一张使用FFmpeg编码音频的流程图. 使用该流程.不仅能够编码AAC的音频,并且能够编码MP3,MP2等等各种FFmpe

最简单的基于FFmpeg的移动端例子:Windows Phone HelloWorld

===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:Android HelloWorld 最简单的基于FFmpeg的移动端例子:Android 视频解码器 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版 最简单的基于FFmpeg的移动端例子:Android 推流器 最简单的基于FFmpeg的移动端例子:Android 视频转

最简单的基于DirectShow的示例:获取Filter信息

===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视频播放器 最简单的基于DirectShow的示例:视频播放器图形界面版 最简单的基于DirectShow的示例:视频播放器自定义版 最简单的基于DirectShow的示例:获取Filter信息 =====================================================

最简单的基于libVLC的例子:最简单的基于libVLC的视频播放器

本文记录使用libVLC的开发的最简单的视频播放器示例.VLC Media Player是一款优秀的播放器,但是由于它的源代码编译的难度比较大,一直没有深入研究过它的开发方面的技术.此前触到了一些VLC开发方面的东西,因此总结了一下libVLC的开发示例程序. 如何获取VLC的SDK VLC开发所需的库文件可以有2种获取方法: 1. 自行编译2. 直接从安装目录里面拷贝出来 第一种方法难度要大一些.尤其是在Windows下编译VLC是个比较麻烦的事情.一般情况下可以选择第二种方法获取VLC开发所