这几天项目中有个需求,需要对流媒体文件统一转换成FLV格式,再通过UMS在页面播放。
经过各方面的比较,转换工具选择了一款叫做格式工厂的视频转换工具,功能还是相当强大的,可以将各种格式的视频文件进行相互转换,主要还是因为可以通过命令行来指定转换的源文件、目标文件、转换格式以及清晰度等。转换成FLV格式的文件,有三种清晰度可选,分别是"640x480", "320x240", "176x144"。
当然,要使用格式工厂,首先要安装,都是傻瓜式安装,这里给出下载地址:http://www.pcfreetime.com/CN/index.html
下面给出程序中执行转换的部分代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String contentPath = request.getContextPath(); String root = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contentPath+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Video Player</title> <style type="text/css"> body { background-color: #fff; padding: 0 20px; color:#000; font: 13px/18px Arial, sans-serif; } a { color: #360; } h3 { padding-top: 20px; } ol { margin:5px 0 15px 16px; padding:0; list-style-type:square; } </style> </head> <body> <div id="mediaspace"></div> <script type="text/javascript" src="<%=root %>UMS/player.js"></script> <script type="text/javascript"> var so = new SWFObject(\'<%=root%>UMS/player.swf\',\'ply\',\'600\',\'400\',\'9\',\'#000000\'); so.addParam(\'allowfullscreen\',\'true\'); so.addParam(\'allowscriptaccess\',\'always\'); so.addParam(\'wmode\',\'opaque\'); so.addVariable(\'file\',\'<%=request.getAttribute("path")%>\'); so.addVariable(\'start\',\'0\'); so.addVariable(\'autoStart\',\'false\'); so.addVariable(\'streamer\',\'rtmp://127.0.0.1:1935/vod\'); so.addVariable(\'stretching\',\'uniform\'); so.addVariable(\'controlbar\',\'over\'); so.addVariable(\'viral.onpause\',\'true\'); so.addVariable(\'viral.allowmenu\',\'true\'); so.addVariable(\'skin\',\'<%=root%>UMS/glow.zip\') so.write(\'mediaspace\'); </script> </body> </html>
执行完成后,会在相应的路径下,存储转换之后的三种格式的FLV文件。
接下来说一下查看,我是用的UMS作为查看工具的,一来是支持播放FLV格式视频文件,二来本身有处理并发的机制,用法还是很简单的,直接将UMS安装目录下的UMS\Player文件夹中glow.zip,live.swf,player.js,player.swf几个文件,放到web服务器中的UMS文件夹下,还有用于显示的页面是vod.html,由于HTML页面不能动态传参数,我改成了vod.jsp,页面中部分代码如下:
// 三种转换格式 String[] quality = {"640x480", "320x240", "176x144"}; // 三种格式FLV文件对应的存储根路径 String[] flv_path = {TransConfig.VIDEO_DEST_ROOT_HIGH, TransConfig.VIDEO_DEST_ROOT_NORMAL, TransConfig.VIDEO_DEST_ROOT_LOW}; //源文件及目标文件合法性验证 start *** ...... //源文件及目标文件合法性验证 end *** for (int i = 0; i < 3; i++) { try { //允许覆盖已有文件,如果目标文件已经存在,则删除 File file = new File(flv_path[i]+flvFilename); if(file.exists()){ file.delete(); } // 拼接流媒体转换的命令 //FF_HOME为格式工厂的命令执行目录 //例如,我的是D:\\FormatFactory\\FormatFactory.exe String command = TransConfig.FF_HOME + " \"-> FLV\" \""+quality[i]+"\" \"" + videoFilename + "\" \"" + flv_path[i]+flvFilename + "\""; Process process = Runtime.getRuntime().exec(command); BufferedReader buffer = new BufferedReader(new InputStreamReader(process.getInputStream())); while (buffer.readLine() != null); buffer.close(); // 根据生成目标文件存在与否,判断转换是否成功 File dest = new File(flv_path[i]+flvFilename); // 转换失败 if (!dest.exists()) { info = new TransInfo(); info.setMsg("没有正常生成,转换失败。"); return info; } } catch (IOException e) { e.printStackTrace(); info = new TransInfo(); info.setMsg("转换文档为FLV文件失败!"); return info; } }
其中有用的也就两句:
so.addVariable(\'file\',\'<%=request.getAttribute("path")%>\'); 后面的参数给出实际要播放的文件的存储位置
so.addVariable(\'streamer\',\'rtmp://127.0.0.1:1935/vod\'); 指定UMS服务器的地址,远程调用服务的话,将IP改成对应的IP即可
最后,关于UMS有两点需要注意:
1.要记得开启服务
2. 在安装目录下,config文件夹下面,找到UMS_Configure.xml,修改其中的文件存储跟路径节点,修改成你自己的根路径
<PrefListItem name="RtmpMediaFileFolder">
<ValueItem>D:/UMS/video/dest</ValueItem>
</PrefListItem>