- 博客(3)
- 资源 (1)
- 收藏
- 关注
原创 kafka测试环境部署
kafka 是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率。(官网地址:http://kafka.apache.org)本文讲解在三台虚拟机中安装部署kafka集群。
2016-05-31 10:32:54 536
原创 zookeeper测试环境部署
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合。通过这些原语言的组合使用,能够帮助我们解决更高层次的分布式问题。本文讲解如何使用三台虚拟机搭建zookeeper集群环境
2016-05-30 14:13:31 732
ffmpeg-20170620-ae6f6d4-win64
基于ffmpeg 进行视频转换 flv\mp4\3gp\wmv等
package cn.fourtwoone.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @author Eoge E-mail:18802012501@139.com
* @version 创建时间:2017年6月23日 上午9:13:12
* 类说明
*/
public class FfmpegManager {
private static ConcurrentMap<String, ConcurrentMap<String, Object>> handlerMap = new ConcurrentHashMap<String, ConcurrentMap<String, Object>>(20);
private static int checkContentType(String path) {
String type = path.substring(path.lastIndexOf(".") + 1, path.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private static boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
return false;
}
return true;
}
protected String getComm4Map(Map<String, Object> paramMap) {
// -i:输入流地址或者文件绝对地址
StringBuilder comm = new StringBuilder();
if(paramMap.containsKey("fp"))
{
comm.append(paramMap.get("fp")).append(" -i");
}else
comm.append("ffmpeg -i ");
// 是否有必输项:输入地址,输出地址,应用名
if (paramMap.containsKey("input") && paramMap.containsKey("output") && paramMap.containsKey("name")) {
comm.append(paramMap.get("input")).append(" ");
// -f :转换格式,默认flv
comm.append(" -f ").append(paramMap.containsKey("fmt") ? paramMap.get("fmt") : "flv").append(" ");
// -r :帧率,默认25
comm.append("-r ").append(paramMap.containsKey("fps") ? paramMap.get("fps") : "30").append(" ");
// -s 分辨率 默认是原分辨率
comm.append("-s ").append(paramMap.containsKey("rs") ? paramMap.get("rs") : "").append(" ");
// -an 禁用音频
comm.append("-an ").append(
paramMap.containsKey("disableAudio") && ((Boolean) paramMap.get("disableAudio")) ? "-an" : "")
.append(" ");
// 输出地址
comm.append(paramMap.get("output"));
// 发布的应用名
comm.append(paramMap.get("name"));
// 一个视频源,可以有多个输出,第二个输出为拷贝源视频输出,不改变视频的各项参数
comm.append(" ").append(" -vcodec copy -f flv -an rtmp://192.168.30.21/live/test2");
System.out.println(comm.toString());
return comm.toString();
} else {
throw new RuntimeException("输入流地址不能为空!");
}
}
public String push(Map<String, Object> paramMap) throws IOException {
// 从map里面取数据,组装成命令
String comm = getComm4Map(paramMap);
ConcurrentMap<String, Object> resultMap = null;
// 执行命令行
final Process proc = Runtime.getRuntime().exec(comm);
System.out.println("执行命令----start commond");
OutHandler errorGobbler = new OutHandler(proc.getErrorStream(), "Error");
OutHandler outputGobbler = new OutHandler(proc.getInputStream(), "Info");
errorGobbler.start();
outputGobbler.start();
// 返回参数
resultMap = new ConcurrentHashMap<String, Object>();
resultMap.put("info", outputGobbler);
resultMap.put("error", errorGobbler);
resultMap.put("process", proc);
String key = paramMap.hashCode()+"";
handlerMap.put(key, resultMap);
return key;
}
public void removePush(String pushId)
{
if (handlerMap.containsKey(pushId))
{
ConcurrentMap<String, Object> map = handlerMap.get(pushId);
//关闭两个线程
((OutHandler)map.get("error")).destroy();
((OutHandler)map.get("info")).destroy();
System.out.println("停止命令-----end commond");
//关闭命令主进程
((Process)map.get("process")).destroy();
handlerMap.remove(pushId);
}
}
public class OutHandler extends Thread
{
// 控制线程状态
volatile boolean status = true;
BufferedReader br = null;
String type = null;
public OutHandler(InputStream is, String type)
{
br = new BufferedReader(new InputStreamReader(is));
this.type = type;
}
/**
* 重写线程销毁方法,安全的关闭线程
*/
@Override
public void destroy()
{
status = false;
}
/**
* 执行输出线程
*/
@Override
public void run()
{
String msg = null;
try
{
while (status)
{
if ((msg = br.readLine()) != null)
{
System.out.println(type + "消息:" + msg);
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
FfmpegManager pusher = new FfmpegManager();
Map<String, Object> map=new HashMap<String, Object>();
map.put("fp", "D:/Program Files/ffmpeg/bin/ffmpeg");
map.put("name", "test3");
map.put("input", "rtsp://admin:admin@192.168.2.236:37779/cam/realmonitor?channel=1&subtype=0");
map.put("output", "rtmp://192.168.30.21/live/");
map.put("fmt", "mp4");
map.put("fps", "25");
map.put("rs", "640x360");
map.put("disableAudio", true);
try {
// 推送后会获得该处理器的id,通过该id可关闭推送流
String id = pusher.push(map);
Thread.sleep(100000);
// 关闭推送流
pusher.removePush(id);
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
2017-06-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人