Coder Social home page Coder Social logo

eguid / ffch4j Goto Github PK

View Code? Open in Web Editor NEW
504.0 32.0 224.0 33.66 MB

FFCH4J项目全称:FFmpeg命令处理器(原用名FFmpegComandHandler4java,FFmpeg命令行运行管理器)。不仅仅只是跨平台的ffmpeg命令执行、停止、查询功能的处理器,还是跨平台的命令行操作处理器

Home Page: http://blog.csdn.net/eguid_1/article/details/52968220

License: Apache License 2.0

Java 100.00%

ffch4j's Introduction

LICENSE LICENSE

FFCH4J(原用名:FFmpegCommandHandler4java)

FFCH4J项目全称:FFmpeg命令处理器,鉴于很多小伙伴们反馈原名太长,改为‘FFCH4J’

说明

java封装的提供ffmpeg命令执行、停止、查询功能的简单管理器 。 FFCH4j不仅仅只支持ffmpeg命令,还支持执行多平台的命令行指令,不管是执行linux命令还是windows的命令行都是手到擒来(注意:本项目并未屏蔽某些敏感操作,比如rm -rf,当然这会产生一些风险,还请注意规避)。 除了保证命令行运行,还拥有独立的轻量级的保活线程来重启因为异常故障导致中断的任务。

特性

零依赖(不依赖任何第三方jar包,只需要java运行环境即可运行),完全接口化(所有内部组件都实现了完全接口化,开发人员可以方便的修改和扩展程序,比如自行实现持久层接口来替换默认的持久层)

版本说明

本次更新说明
1、配置文件增加保活线程和回调地址
2、新增命令行流式组装执行器
3、新增保活线程处理器,用于在后台保证任务可靠运行,如果任务中途中断,则立即强制重启任务,定制需要实现OutHandlerMethod接口并注入到命令行管理器
4、新增事件回调,将下个版本将整合进主程序中

上个版本更新说明
1、本次更新主要针对配置文件的加载优化,详情见下面的使用说明
初始化FFmpegManager时会自动查找loadFFmpeg.properties配置文件
 配置文件的加载方式如下:
(1)、javaSE项目会自动从项目根目录加载
(2)、javaEE项目会自动从classes目录下加载(编写web项目的src目录下)
(3)、如果上述位置都没有找到配置文件,会自动加载默认配置,默认的配置文件在config包下的defaultFFmpegConfig.properties中

2、支持自定义的消息输出

上个版本更新说明
3、增加一个String start(String id,String commond,boolean hasPath)接口,用于区分是否使用配置文件中的绝对路径,如果为false,请务必保证ffmpeg的路径可以正确加载
4、增加一个debug配置,用于判断是否输出关键位置的debug消息

基于

本项目基于jdk1.7开发,FFmpeg各版本支持的命令请参考FFmpeg官方文档

使用说明

	 //18.12.02新版本创建方式
	CommandManager manager=new CommandManagerImpl(10);

	//老版本创建方式:
	FFmpegManager manager=new FFmpegManagerImpl(10);
	//当然也可以这样
	FFmpegManager manager=new FFmpegManagerImpl();//这样会从配置文件中读取size的值作为初始化参数
	//组装命令
	Map map = new HashMap();
	map.put("appName", "test123");
	map.put("input","rtsp://admin:[email protected]:37779/cam/realmonitor?channel=1&subtype=0");
	map.put("output", "rtmp://192.168.30.21/live/");
	map.put("codec","h264");
	map.put("fmt", "flv");
	map.put("fps", "25");
	map.put("rs", "640x360");
	map.put("twoPart","2");
	//执行任务,id就是appName,如果执行失败返回为null
	String id=manager.start(map);
	System.out.println(id);
	//通过id查询
	TaskEntity info=manager.query(id);
	System.out.println(info);
	//查询全部
	Collection<TaskEntity> infoList=manager.queryAll();
	System.out.println(infoList);

	//停止id对应的任务
	manager.stop(id);
	
	//流式命令行组装执行
	manager.start("test1", CommandBuidlerFactory.createBuidler()
				.add("ffmpeg").add("-i","rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov")
				.add("-rtsp_transport","tcp")
				.add("-vcodec","copy")
				.add("-acodec","copy")
				.add("-f","flv")
				.add("-y").add("rtmp://eguid.cc/rtmp/test1"));
	manager.stop("test1");//停止
	
	//执行原生ffmpeg命令(不包含ffmpeg的执行路径,该路径会从配置文件中自动读取)
	manager.start("test1", "ffmpeg -i input_file -vcodec copy -an output_file_video");
	//包含完整ffmpeg执行路径的命令
	manager.start("test2,","d:/ffmpeg/ffmpeg -i input_file -vcodec copy -an output_file_video",true);
	//停止全部任务
	manager.stopAll();
	
	//用于销毁保活线程等
	manager.destory();

关于FFmpegCommandHandler接口调用/使用方式也可以参考readme文件

下个版本构想

1、新增控制台,web控制台和客户端控制台,可以使用web来管理任务信息查看、发布任务、停止任务等
2、新增事件回调、命令的执行、停止、中断、保活等都将会使用外部接口回调通知或确认操作
 目前事件回调已经完成,等待下个版本整合进主程序,保活处理器已经完成(已完成,下个版本中提供)
3、提供web方式的api接口,方便远程调用api来控制
4、不需要配置文件进行初始化(已完成,下个版本中提供)

ffch4j's People

Contributors

eguid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ffch4j's Issues

摄像头断网问题

您好,我搭建了一个推流服务器,并部署了您的代码,能够成功运行。但当摄像头断电断网时,ErrorStream 没有任何输出,代码会阻塞在readLine 处,无法将任务提交到保活处理器。我使用的ffmpeg版本是2.8.15,请问您遇到过这个问题吗?有什么解决方案吗?

发生网络异常丢包,消息体:频繁出现丢包情况

tests发生网络异常丢包,消息体:[rtsp @ 0000000000eea340] max delay reached. need to consume packet
tests发生网络异常丢包,消息体:[rtsp @ 0000000000eea340] RTP: missed 5 packets
tests发生网络异常丢包,消息体:[rtsp @ 0000000000eea340] max delay reached. need to consume packet
tests发生网络异常丢包,消息体:[rtsp @ 0000000000eea340] RTP: missed 4 packets
tests:frame=13302 fps= 25 q=28.0 size= 155248kB time=00:08:53.56 bitrate=2383.6kbits/s dup=0 drop=5 speed=0.998x

我用的是java写的test程序,实现rtsp转为rtmp并推流出去通过Nginx后在WEB页面通过

具体代码很简单如下: 用户名和密码暂时用了密码代替...
String ip = "192.168.1.11";
String id = "tests";
FFmpegManagerImpl manager = null;
if (manager == null) {
manager = new FFmpegManagerImpl();
}
Map<String,String> map = new HashMap<>();
map.put("appName", id);
map.put("input", "rtsp://username:password@" + ip + ":554");
map.put("output", "rtmp://localhost/live/");
map.put("codec", "h264");
map.put("fmt", "flv");
map.put("fps", "25");
map.put("rs", "640x360");
map.put("twoPart", "0");
// 执行任务,id就是ap"pName,如果执行失败返回为null
return manager.start(map);

您好,感觉有的流断的不彻底

您好,非常感谢您的这个开源项目,给我带来了很大的便利,我用您的项目做了一个摄像头推流rstp转换到rtmp的项目,发现了在结束推流命令后,偶尔会存在rtmp流已经停止了输出,但是ffmpeg的拉rtsp流还在继续运行,不知道这个具体该如何检查流的这个状态,或者怎么可以结束这个拉流行为,日志追踪看到所有的stop都是正常的,期待您的解惑,非常感谢您的付出!

运行后提示超时

F:\utils\jdk\jdk8\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:58979,suspend=y,server=n -javaagent:F:\utils\IDEA\lib\rt\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath F:\utils\jdk\jdk8\jre\lib\charsets.jar;F:\utils\jdk\jdk8\jre\lib\deploy.jar;F:\utils\jdk\jdk8\jre\lib\ext\access-bridge-64.jar;F:\utils\jdk\jdk8\jre\lib\ext\cldrdata.jar;F:\utils\jdk\jdk8\jre\lib\ext\dnsns.jar;F:\utils\jdk\jdk8\jre\lib\ext\jaccess.jar;F:\utils\jdk\jdk8\jre\lib\ext\jfxrt.jar;F:\utils\jdk\jdk8\jre\lib\ext\localedata.jar;F:\utils\jdk\jdk8\jre\lib\ext\nashorn.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunec.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunjce_provider.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunmscapi.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunpkcs11.jar;F:\utils\jdk\jdk8\jre\lib\ext\zipfs.jar;F:\utils\jdk\jdk8\jre\lib\javaws.jar;F:\utils\jdk\jdk8\jre\lib\jce.jar;F:\utils\jdk\jdk8\jre\lib\jfr.jar;F:\utils\jdk\jdk8\jre\lib\jfxswt.jar;F:\utils\jdk\jdk8\jre\lib\jsse.jar;F:\utils\jdk\jdk8\jre\lib\management-agent.jar;F:\utils\jdk\jdk8\jre\lib\plugin.jar;F:\utils\jdk\jdk8\jre\lib\resources.jar;F:\utils\jdk\jdk8\jre\lib\rt.jar;F:\workspace\pw-wangtao\target\classes;E:\m2localRepository\net\sf\json-lib\json-lib\2.4\json-lib-2.4-jdk15.jar;E:\m2localRepository\commons-beanutils\commons-beanutils\1.8.0\commons-beanutils-1.8.0.jar;E:\m2localRepository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;E:\m2localRepository\commons-lang\commons-lang\2.5\commons-lang-2.5.jar;E:\m2localRepository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;E:\m2localRepository\net\sf\ezmorph\ezmorph\1.0.6\ezmorph-1.0.6.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter-web\2.0.3.RELEASE\spring-boot-starter-web-2.0.3.RELEASE.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter\2.0.3.RELEASE\spring-boot-starter-2.0.3.RELEASE.jar;E:\m2localRepository\org\springframework\boot\spring-boot\2.0.3.RELEASE\spring-boot-2.0.3.RELEASE.jar;E:\m2localRepository\org\springframework\boot\spring-boot-autoconfigure\2.0.3.RELEASE\spring-boot-autoconfigure-2.0.3.RELEASE.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter-logging\2.0.3.RELEASE\spring-boot-starter-logging-2.0.3.RELEASE.jar;E:\m2localRepository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\m2localRepository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\m2localRepository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;E:\m2localRepository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;E:\m2localRepository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;E:\m2localRepository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\m2localRepository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter-json\2.0.3.RELEASE\spring-boot-starter-json-2.0.3.RELEASE.jar;E:\m2localRepository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;E:\m2localRepository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\m2localRepository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;E:\m2localRepository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;E:\m2localRepository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;E:\m2localRepository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter-tomcat\2.0.3.RELEASE\spring-boot-starter-tomcat-2.0.3.RELEASE.jar;E:\m2localRepository\org\apache\tomcat\embed\tomcat-embed-core\8.5.31\tomcat-embed-core-8.5.31.jar;E:\m2localRepository\org\apache\tomcat\embed\tomcat-embed-el\8.5.31\tomcat-embed-el-8.5.31.jar;E:\m2localRepository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.31\tomcat-embed-websocket-8.5.31.jar;E:\m2localRepository\org\hibernate\validator\hibernate-validator\6.0.10.Final\hibernate-validator-6.0.10.Final.jar;E:\m2localRepository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\m2localRepository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\m2localRepository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;E:\m2localRepository\org\springframework\spring-web\5.0.7.RELEASE\spring-web-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-beans\5.0.7.RELEASE\spring-beans-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-webmvc\5.0.7.RELEASE\spring-webmvc-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-aop\5.0.7.RELEASE\spring-aop-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-context\5.0.7.RELEASE\spring-context-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-expression\5.0.7.RELEASE\spring-expression-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\boot\spring-boot-starter-data-redis\2.0.3.RELEASE\spring-boot-starter-data-redis-2.0.3.RELEASE.jar;E:\m2localRepository\org\springframework\data\spring-data-redis\2.0.8.RELEASE\spring-data-redis-2.0.8.RELEASE.jar;E:\m2localRepository\org\springframework\data\spring-data-keyvalue\2.0.8.RELEASE\spring-data-keyvalue-2.0.8.RELEASE.jar;E:\m2localRepository\org\springframework\data\spring-data-commons\2.0.8.RELEASE\spring-data-commons-2.0.8.RELEASE.jar;E:\m2localRepository\org\springframework\spring-tx\5.0.7.RELEASE\spring-tx-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-oxm\5.0.7.RELEASE\spring-oxm-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-context-support\5.0.7.RELEASE\spring-context-support-5.0.7.RELEASE.jar;E:\m2localRepository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;E:\m2localRepository\io\lettuce\lettuce-core\5.0.4.RELEASE\lettuce-core-5.0.4.RELEASE.jar;E:\m2localRepository\io\projectreactor\reactor-core\3.1.8.RELEASE\reactor-core-3.1.8.RELEASE.jar;E:\m2localRepository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;E:\m2localRepository\io\netty\netty-common\4.1.25.Final\netty-common-4.1.25.Final.jar;E:\m2localRepository\io\netty\netty-transport\4.1.25.Final\netty-transport-4.1.25.Final.jar;E:\m2localRepository\io\netty\netty-buffer\4.1.25.Final\netty-buffer-4.1.25.Final.jar;E:\m2localRepository\io\netty\netty-resolver\4.1.25.Final\netty-resolver-4.1.25.Final.jar;E:\m2localRepository\io\netty\netty-handler\4.1.25.Final\netty-handler-4.1.25.Final.jar;E:\m2localRepository\io\netty\netty-codec\4.1.25.Final\netty-codec-4.1.25.Final.jar;E:\m2localRepository\org\springframework\spring-core\5.0.7.RELEASE\spring-core-5.0.7.RELEASE.jar;E:\m2localRepository\org\springframework\spring-jcl\5.0.7.RELEASE\spring-jcl-5.0.7.RELEASE.jar;F:\workspace\pw-wangtao\src\main\webapp\WEB-INF\lib\FFmpegCommandHandler.jar;E:\m2localRepository\net\sourceforge\javacsv\javacsv\2.0\javacsv-2.0.jar;F:\utils\IDEA\lib\idea_rt.jar pw.wangtao.core.rtspTortmp.RtspToRtmp
Connected to the target VM, address: '127.0.0.1:58979', transport: 'socket'
尝试从web目录读取配置文件:/F:/workspace/pw-wangtao/target/classes/loadFFmpeg.properties
没找到配置文件,读取默认配置文件
读取默认配置文件:defaultFFmpegConfig.properties
加载配置文件...
加载配置文件完毕
读取的配置项:{path=E:/gitSrc/ffmpeg/ffmpeg-20181130-ba71ebb-win64-static/bin/, defaultpathEnable=true, debug=true, size=100, #ffmpegæ�§è¡�è·¯å¾�ï¼�ä¸�è�¬ä¸ºffmpegç��å®�è£�ç�®å½�ï¼�该路å¾�å�ªè�½æ�¯ç�®å½�ï¼�ä¸�è�½ä¸ºå�·ä½�æ��件路å¾�ï¼�å�¦å��ä¼�æ�¥é��=}
转换后的对象:FFmpegConfig [path=E:/gitSrc/ffmpeg/ffmpeg-20181130-ba71ebb-win64-static/bin/, debug=true, size=100]
执行命令:E:/gitSrc/ffmpeg/ffmpeg-20181130-ba71ebb-win64-static/bin/ffmpeg -i rtsp://admin:[email protected]:554/Streaming/Channels/1 -vcodec h264 -f flv -an rtmp://192.168.1.170/live/test1231
test1231
test1231开始推流!
test1231发生网络异常丢包,消息体:[rtsp @ 00000270b3f0a180] UDP timeout, retrying with TCP
test1231发生网络异常丢包,消息体:[rtsp @ 00000270b3f0a180] method PAUSE failed: 551 Option not supported
test1231发生网络异常丢包,消息体:[rtsp @ 00000270b3f0a180] UDP timeout, retrying with TCP
test1231发生网络异常丢包,消息体:[rtsp @ 00000270b3f0a180] method PAUSE failed: 551 Option not supported
test1231:frame= 0 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
test1231:frame= 0 fps=0.0 q=0.0 Lsize= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
Disconnected from the target VM, address: '127.0.0.1:58979', transport: 'socket'

Process finished with exit code 0

help

tests:frame= 8815 fps= 20 q=28.0 size= 145049kB time=00:07:13.68 bitrate=2739.9kbits/s dup=0 drop=5 speed=0.992x
tests发生网络异常丢包,消息体:[rtsp @ 00000211e1eaa4c0] max delay reached. need to consume packet
tests发生网络异常丢包,消息体:[rtsp @ 00000211e1eaa4c0] RTP: missed 12 packets

可以推流,但是总是丢包,请问如何解决?

运行后,manager.start(map)返回的id一直是null

F:\utils\jdk\jdk8\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:54836,suspend=y,server=n -javaagent:F:\utils\IDEA\lib\rt\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath E:\gitSrc\java_rtsp\FFmpegCommandHandler4java\bin;F:\utils\jdk\jdk8\jre\lib\charsets.jar;F:\utils\jdk\jdk8\jre\lib\deploy.jar;F:\utils\jdk\jdk8\jre\lib\ext\access-bridge-64.jar;F:\utils\jdk\jdk8\jre\lib\ext\cldrdata.jar;F:\utils\jdk\jdk8\jre\lib\ext\dnsns.jar;F:\utils\jdk\jdk8\jre\lib\ext\jaccess.jar;F:\utils\jdk\jdk8\jre\lib\ext\jfxrt.jar;F:\utils\jdk\jdk8\jre\lib\ext\localedata.jar;F:\utils\jdk\jdk8\jre\lib\ext\nashorn.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunec.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunjce_provider.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunmscapi.jar;F:\utils\jdk\jdk8\jre\lib\ext\sunpkcs11.jar;F:\utils\jdk\jdk8\jre\lib\ext\zipfs.jar;F:\utils\jdk\jdk8\jre\lib\javaws.jar;F:\utils\jdk\jdk8\jre\lib\jce.jar;F:\utils\jdk\jdk8\jre\lib\jfr.jar;F:\utils\jdk\jdk8\jre\lib\jfxswt.jar;F:\utils\jdk\jdk8\jre\lib\jsse.jar;F:\utils\jdk\jdk8\jre\lib\management-agent.jar;F:\utils\jdk\jdk8\jre\lib\plugin.jar;F:\utils\jdk\jdk8\jre\lib\resources.jar;F:\utils\jdk\jdk8\jre\lib\rt.jar;F:\utils\IDEA\lib\idea_rt.jar pw.wangtao.core.RtspToRtmp
Connected to the target VM, address: '127.0.0.1:54836', transport: 'socket'
加载配置文件...
加载配置文件完毕
读取的配置项:{path=F:/gitRepostory/FFmpegCommandHandler4java/src/cc/eguid/FFmpegCommandManager/ffmpeg/, debug=true, size=10}
转换后的对象:FFmpegConfig [path=F:/gitRepostory/FFmpegCommandHandler4java/src/cc/eguid/FFmpegCommandManager/ffmpeg/, debug=true, size=10]
执行命令:F:/gitRepostory/FFmpegCommandHandler4java/src/cc/eguid/FFmpegCommandManager/ffmpeg/ffmpeg -i rtsp://admin:[email protected]:554/Streaming/Channels/1 -vcodec h264 -f flv -an rtmp://192.168.1.170/live/test123
执行命令失败!正在停止进程和输出线程...
null
Disconnected from the target VM, address: '127.0.0.1:54836', transport: 'socket'

Process finished with exit code 0

关于切换视频流的问题

大佬您好,我是用您的代码改了改,从配置文件读取rtsp输入流然后转rtmp推到nginx上,有个疑问是这样的,我如何获取正在执行的任务或者流呢,我用stop,stopAll,还有destory都停止不了任务,如果我想在命令执行的过程中切换输入流,是否应该先停止正在执行的任务,然后再开启下一个推流,请问应该如何停止之前的任务呢?taskDao.getAll()里面也是null,还请您多指教

使用视频推流,如何感知进程结束

从网络上只有几分钟的的视频源 : rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov 作为输入源,然后推流到服务器,视频结束时,CommandTasker 中当前的任务进程状态为true , 如何能在推流结束时,自动关闭进程或者能感知到推流完成呢

发布到maven仓库

感谢你写的这么好的封装,请问是否可发布到maven仓库,方便项目引用

版本更新加油啊

之前没找到方案,自己写了一个,和你这方法类似,但是坑太多了,太难踩了就放弃了

昨天开始自己开发一点web 控制台的功能
360截图17700517114150100
360截图18720123109137137

贵兄是业余开发这个的吗,目前进度怎么样了?

输出rtmp错误提示未知错误

`Connected to the target VM, address: '127.0.0.1:55793', transport: 'socket'
尝试从web目录读取配置文件:/E:/FFmpegCommandHandler4java-master/bin/loadFFmpeg.properties
web目录读取到配置文件:/E:/FFmpegCommandHandler4java-master/bin/loadFFmpeg.properties
加载配置文件...
加载配置文件完毕
读取的配置项:{path=D:/ffmpeg/bin/, debug=true, size=10}
转换后的对象:FFmpegConfig [path=D:/ffmpeg/bin/, debug=true, size=10]
执行命令:D:/ffmpeg/bin/ffmpeg -i rtsp://admin:a1234567@【些处为IP】:554/Streaming/Channels/1401 -f flv -r 25 -g 25 -s 640x360 -an rtmp://127.0.0.1/live/test123 -vcodec copy -f flv -an rtmp://127.0.0.1/live/test123HD
test123
TaskEntity [id=test123, process=java.lang.ProcessImpl@3dee2310, thread=Thread[Thread-0,5,main]]
[TaskEntity [id=test123, process=java.lang.ProcessImpl@3dee2310, thread=Thread[Thread-0,5,main]]]
test123开始推流!
test123:完整消息:ffmpeg version N-92226-g2797bd5c81 Copyright (c) 2000-2018 the FFmpeg developers
test123:完整消息: built with gcc 8.2.1 (GCC) 20181017
test123:完整消息: configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
test123:完整消息: libavutil 56. 19.101 / 56. 19.101
test123:完整消息: libavcodec 58. 33.102 / 58. 33.102
test123:完整消息: libavformat 58. 19.101 / 58. 19.101
test123:完整消息: libavdevice 58. 4.105 / 58. 4.105
test123:完整消息: libavfilter 7. 36.100 / 7. 36.100
test123:完整消息: libswscale 5. 2.100 / 5. 2.100
test123:完整消息: libswresample 3. 2.100 / 3. 2.100
test123:完整消息: libpostproc 55. 2.100 / 55. 2.100
test123:完整消息:[udp @ 000001f025d3e0c0] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
test123:完整消息:[udp @ 000001f025d50c80] 'circular_buffer_size' option was set but it is not supported on this build (pthread support is required)
test123发生网络异常丢包,消息体:[rtsp @ 000001f025d3ba40] max delay reached. need to consume packet
test123发生网络异常丢包,消息体:[rtsp @ 000001f025d3ba40] RTP: missed 170 packets
test123:完整消息:[rtsp @ 000001f025d3ba40] max delay reached. need to consume packet
test123:完整消息:[rtsp @ 000001f025d3ba40] RTP: missed 170 packets
test123:完整消息:[h264 @ 000001f025d3f2c0] error while decoding MB 18 24, bytestream -35
test123:完整消息:[h264 @ 000001f025d3f2c0] concealing 5311 DC, 5311 AC, 5311 MV errors in I frame
test123:完整消息:Input #0, rtsp, from 'rtsp://admin:a1234567@【些处为IP】:554/Streaming/Channels/1401':
test123:完整消息: Metadata:
test123:完整消息: title : HIK Media Server V3.4.98
test123:完整消息: comment : HIK Media Server Session Description : standard
test123:完整消息: Duration: N/A, start: 2.120000, bitrate: N/A
test123:完整消息: Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, 25 fps, 25.08 tbr, 90k tbn, 50 tbc
test123:完整消息:[tcp @ 000001f025d7f500] Connection to tcp://127.0.0.1:1935 failed: Error number -138 occurred
test123:完整消息:[rtmp @ 000001f0282cef40] Cannot open connection tcp://127.0.0.1:1935
test123:完整消息:rtmp://127.0.0.1/live/test123: Unknown error
正在停止任务:test123
Disconnected from the target VM, address: '127.0.0.1:55793', transport: 'socket'

Process finished with exit code 0`
能帮忙看看什么原因吗

代码问题

在使用中碰到一些问题,有些查了下源码,有些大致看了下,有几个问题想请教下;

  1. 创建任务的时候,有时候我会希望创建成功会做一些事情,源码如下
String start = commandManager.start(startId.toString(), CommandBuidlerFactory.createBuidler().add(zhiboConfig.getCmd()));
log.info("执行任务返回结果{}: {}", null == start ? "失败" : "成功", start);
if (null != start) {
    ZhiBoRunningStore.setZhiBo(zhiboConfig, ZhiBoState.State.running);
}

// 但对应的tart源码却如下
public String start(String id, String command, boolean hasPath) {
		if (isInit(true)) {
			System.err.println("执行失败,未进行初始化或初始化失败!");
			return null;
		}
		if (id != null && command != null) {
			CommandTasker tasker = taskHandler.process(id, hasPath ? command : config.getPath() + command);
			if (tasker != null) {
				int ret = taskDao.add(tasker);
				if (ret > 0) {
					return tasker.getId();
				} else {
					// 持久化信息失败,停止处理
					taskHandler.stop(tasker.getProcess(), tasker.getThread());
					if (config.isDebug())
						System.err.println("持久化失败,停止任务!");
				}
			}
		}
		return null;
	}

由于taskDao的存在,第一次成功会把数据放进去,假如之后任务出现了问题,非应用挂掉,我想重启这个任务,在这条数据没有清除的情况下,我可能更希望任务存在直接返回任务id就好?
因为目前有没有启动成功我也只能通过返回的这个字符串来判断了,而这个字符串本身却并不具备这个含义;

  1. 关于保活线程如下的代码疑问
	@Override
	public void run() {
		for(;stop_index==0;) {
			while(queue==null) {
				try {
					condition.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			String id=null;
			CommandTasker task=null;
			
			try {
				while(queue.peek() != null) {
					System.err.println("准备重启任务:"+queue);
					id=queue.poll();
					task=taskDao.get(id);
					//重启任务
					ExecUtil.restart(task);
				}
			}catch(IOException e) {
				System.err.println(id+" 任务重启失败,详情:"+task);
				//重启任务失败
				err_index++;
			}catch(Exception e) {
				
			}
		}
	}

开启保活线程的情况下,CommandManagerImpl每次没创建都会创建一个保活线程,而保活线程是采用无线循环的方式来循环,在实际使用过程中每个创建的CommandManagerImpl都会让一个cpu的使用率达到100%,看起来CommandManagerImpl应该是当个全局管理类来使用,但依然会存在让一个cpu的使用率过高的问题,我觉得是否可以再OutHandler将重启任务交给保活线程的时候再唤醒,当保活线程队列中没任务的时候继续等待;

  1. 关于OutHandler能否抽象出来?目前的实现固定了也无法自己实现,而原来的实现在进程没有输出之后默默的关闭了自己的线程,却没有告知其它任何组件当前进程无消息输出了,这个状态对于有些情况来说很重要,因为目前只有异常或丢包,但还有一种就是本身没有故障,只是源没有消息了
/**
	 * 执行输出线程
	 */
	@Override
	public void run() {
		String msg = null;
		try {
			if (CommandManager.config.isDebug()) {
				System.out.println(id + "开始推流!");
			}
			while (desstatus && (msg = br.readLine()) != null) {
				ohm.parse(id, msg);
				if (ohm.isbroken()) {
					System.err.println("检测到中断,提交重启任务给保活处理器");
					//如果发生异常中断,立即进行保活
					//把中断的任务交给保活处理器进行进一步处理
					KeepAliveHandler.add(id);
					condition.signal();
				}
			}
		} catch (IOException e) {
			System.out.println("发生内部异常错误,自动关闭[" + this.getId() + "]线程");
			destroy();
		} finally {
			if (this.isAlive()) {
				destroy();
			}
		}
	}

以上问题可能有自己没看明白的地方,还请不吝赐教;

linux支持

请问这个项目支持linux下使用吗?
另外在安装ffmpeg时候有什么注意事项吗?
谢谢!

新版本

老哥 什么时候出新版本,支持管理界面

打包成jar找不到配置文件

尝试从web目录读取配置文件:file:/D:/Tools/IntelliJIDEA201901/workspace/mpeg/target/mpeg-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/loadFFmpeg.properties
没找到配置文件,读取默认配置文件
读取默认配置文件:defaultFFmpegConfig.properties
配置文件加载失败!配置文件不存在或配置错误

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.