实现groovy通过队列消息转换视频
上文实现转换视频的最简单groovy程序实现了简单的转换视频功能,只能根据参数做一次转换。需要实现的需求是,跑在后台,根据要求转换视频。
可以自己实现这样的生产者消费者模式,实现一个队列机制,然后启动线程阻塞在空队列上,有生产者放到队列里一条消息,比如转换test.mov为test.mp4,然后线程得到通知消费这个消息,并从队列中删除消息。
这个思路是好的,但是不需要自己写这些代码,可以借助第三方API,使用JMS,这里用到的是JMS的开源免费实现ActiveMQ。具体安装参见tomcat下部署activemq。
好处是省去了自己写底层代码和相关的测试维护工作。而且,activemq自带web管理界面,我们可以先实现消费者(也就是转换视频功能),而通过web管理界面手工生成消息。
生成一条消息,消息正文很简单:
test.mov;test.mp4
分号隔开,前者是需要转换的视频文件路径,后者是转换的文件路径。
在activemq的web console中填写并发送这条消息。
然后,启动VideoConvertor.groovy,可以看到这样的日志:
marshal@ubuntu-desktop:~/workspace/vp/vp-backend/bin$ ./VideoConvertor.groovy
09-11-25 11:37:29 INFO (Convertor:?) – 启动视频转换器…
09-11-25 11:37:29 INFO (Convertor:?) – 视频转换器启动完毕。
09-11-25 11:37:52 DEBUG (Convertor:?) – 收到消息,正文是:test.mov;test.mp4
09-11-25 11:38:18 DEBUG (Convertor:?) – 生成test.mp4成功,耗时25905毫秒。
09-11-25 11:38:18 DEBUG (Convertor:?) – 提交会话。
如果再发送一条jms消息,会有类似的日志,VideoConvertor也不再是执行一次,而是一直监控jms队列,接收消息,转换视频。如果需要将VideoConvertor程序设置为后台应用,可以参照简化groovy原型的jms消费者部分中的做法。
VideoConvertor.groovy源代码:
#!/usr/bin/env groovy
import groovy.lang.Grab;
import org.apache.log4j.*
import javax.jms.*
import org.apache.activemq.ActiveMQConnectionFactory@Grab(group="log4j",module="log4j",version="1.2.12")
@Grab(group="org.apache.activemq",module="activemq-core",version="5.3.0")
class Convertor implements MessageListener{
private static Logger logger=Logger.getLogger(Convertor.class)
static{
PropertyConfigurator.configure("log4j.properties");
}
def connection
def session
def start(){
logger.info("启动视频转换器…")
def connectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616")
connection=connectionFactory.createConnection()
connection.start()
session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE)
def destination=session.createQueue("video_convert")
def consumer=session.createConsumer(destination)
consumer.setMessageListener(this)
logger.info("视频转换器启动完毕。")
}public void onMessage(Message message){
logger.debug("收到消息,正文是:${message.text}")
def parameters=message.text.split(";")
convert(parameters[0],parameters[1])
session.commit()
logger.debug("提交会话。")
}
def convert(input,output){
def time=new Date().time
def file=new File(output)
if(file.exists()){
file.delete()
logger.debug("删除已经存在的输出文件 ${output}。")
}
def process="ffmpeg -i ${input} ${output}".execute()
process.waitFor()
logger.debug("生成${output}成功,耗时${new Date().time-time}毫秒。")
}
}new Convertor().start()
可以在这里下载源代码:
这篇文章上的评论的 RSS feed TrackBack URI