当前位置: 首页 > news >正文

有关建筑网站建设方案怎么做宣传网站

有关建筑网站建设方案,怎么做宣传网站,wordpress怎么映射到外网访问不了,国内新闻热点事件昨晚我在尝试使用Java的ProcessBuilder开辟一个进程执行FFmpeg相关命令对视频进行HLS切片处理的时候,遇到了一个进程阻塞的问题。 我使用的命令 ffmpeg -i D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加…

昨晚我在尝试使用Java的ProcessBuilder开辟一个进程执行FFmpeg相关命令对视频进行HLS切片处理的时候,遇到了一个进程阻塞的问题。

我使用的命令 ffmpeg -i D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加班工资_哔哩哔哩_bilibili.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 D:\\shuzhiworkspace\\Mindhaven\\output\\output.m3u8 在终端命令行执行的时候是没有问题的,一下子就给我出结果了,但是我使用ProcessBuilder开辟的进程,等了半天一直出不来结果,进程陷入了阻塞状态。

问题代码

@Test  
void test16(){  String inputPath = "D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加班工资_哔哩哔哩_bilibili.mp4";  String outputFolder = "/output";  //ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8  String commend = "ffmpeg -i D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加班工资_哔哩哔哩_bilibili.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 D:\\shuzhiworkspace\\Mindhaven\\output\\output.m3u8";  //构建FFmpeg命令参数  String[] cmd = {  "ffmpeg",  "-i",inputPath,  "-c:v", "libx264",  "-c:a", "aac",  "-f", "hls",  "-hls_time", "10",  "-hls_list_size", "0",  outputFolder+"/output.m3u8"  };  //检查目录是否存在  File outputDir = new File(outputFolder);  if(!outputDir.exists()){  boolean mkdirs = outputDir.mkdirs();  if(!mkdirs){  System.out.println("创建目录失败");  return;  }  }  ProcessBuilder processBuilder = new ProcessBuilder(cmd);  System.out.println("工作路径:"+processBuilder.directory());  try {  System.out.println("开始执行FFmpeg命令...");  long l = System.currentTimeMillis();  Process process = processBuilder.start();  System.out.println("pid:"+process.pid());  int exitCode = process.waitFor();  if(exitCode == 0){  System.out.println("视频切片成功!");  }  System.out.println("FFmpeg命令执行完成,耗时:"+(System.currentTimeMillis()-l)+"ms");  } catch (IOException | InterruptedException e) {  e.printStackTrace();  }}

问题解决方案
今天早上,我询问了一下AI大模型,在它的思维链中发现了问题所在。原来FFmpeg在执行转码操作的时候,会持续的输出日志信息到 stdoutstderr这两个流中,而流数据又会先输入到缓冲区中。如果父进程(Java进程)没有主动读取这些流,当缓冲区满了的时候,子进程就会暂停执行并等待父进程(Java进程)消费数据,然而我的Java程序并没有做消费数据的处理,因而形成了死锁。从而表现在我的 int exitCode = process.waitFor(); 无限卡住,无法返回退出码。

而我在终端命令行直接执行时可以成功很快的返回之处在于,终端命令行的进程回去消费stdoutstderr 中的日志信息并输出在终端上,也就是下图所示的输出。

在这里插入图片描述

因此,问题的解决方法就是在Java程序中再开两个子线程,去读取消费stdoutstderr 中的日志信息,避免缓存区阻塞,这样我们的问题就基本解决了。

同时,我们还可以waitFor()方法设置一个超时中断机制,避免因其他未知的原因导致进程无限阻塞。

问题解决后的代码

@Test  
void test17(){  String inputPath = "D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加班工资_哔哩哔哩_bilibili.mp4";  String outputFolder = "/output";  //ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8  String commend = "ffmpeg -i D:\\pythonWorkspace\\bilibili-script\\data\\甚至还没说一句谢谢:懂王称愿自掏腰包付宇航员加班工资_哔哩哔哩_bilibili.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 D:\\shuzhiworkspace\\Mindhaven\\output\\output.m3u8";  //构建FFmpeg命令参数  String[] cmd = {  "ffmpeg",  "-i",inputPath,  "-c:v", "libx264",  "-c:a", "aac",  "-f", "hls",  "-hls_time", "10",  "-hls_list_size", "0",  outputFolder+"/output.m3u8"  };  //检查目录是否存在  File outputDir = new File(outputFolder);  if(!outputDir.exists()){  boolean mkdirs = outputDir.mkdirs();  if(!mkdirs){  System.out.println("创建目录失败");  return;  }  }  ProcessBuilder processBuilder = new ProcessBuilder(cmd);  System.out.println("工作路径:"+processBuilder.directory());  try {  System.out.println("开始执行FFmpeg命令...");  long l = System.currentTimeMillis();  Process process = processBuilder.start();  // 启动线程读取 stdout        Thread stdoutThread = new Thread(() -> {  try (BufferedReader reader = new BufferedReader(  new InputStreamReader(process.getInputStream()))) {  String line;  while ((line = reader.readLine()) != null) {  System.out.println("[FFmpeg] " + line);  }  } catch (IOException e) { e.printStackTrace(); }  });  // 启动线程读取 stderr(关键!FFmpeg 错误信息在此流)  Thread stderrThread = new Thread(() -> {  try (BufferedReader reader = new BufferedReader(  new InputStreamReader(process.getErrorStream()))) {  String line;  while ((line = reader.readLine()) != null) {  System.err.println("[FFmpeg-Error] " + line);  }  } catch (IOException e) { e.printStackTrace(); }  });  stdoutThread.start();  stderrThread.start();  System.out.println("pid:"+process.pid());  boolean exitCode = process.waitFor(60l,TimeUnit.SECONDS);  if(exitCode){  System.out.println("视频切片成功!");  }  System.out.println("FFmpeg命令执行完成,耗时:"+(System.currentTimeMillis()-l)+"ms");  } catch (IOException | InterruptedException e) {  e.printStackTrace();  }}

至此,使用ProcessBuilder执行FFmpeg命令,进程一直处于阻塞状态,一直没有返回执行结果的这个问题就解决了。拜拜~

http://www.dtcms.com/a/428693.html

相关文章:

  • AI与云协作加持:深度解析Chaos Vantage 3.0 颠覆性更新
  • 机器学习算法以及code实现
  • 怎样开自己的网站个人域名可以做网站吗
  • 如何理解“物以类聚,人以群分”?
  • 南通企业网站怎么建设wordpress不用邮箱
  • 企业网站做的好宁波网站制作建设
  • 广州商城网站建设地址wordpress首页不显示整篇文章
  • Tensor Core的MMA与WMMA
  • 大模型计算事实标准--CUDA
  • 网站导航页面模板网络与新媒体就业方向及前景
  • 公司网站 备案南通市建设监理协会网站
  • 洋县住房和城乡建设管理局网站网站中宣传彩页怎么做的
  • 网站群建设进展情况汇报郑州网站开发技术
  • C语言数据结构-堆
  • 网站建设开头营销型网站推广公司
  • 公考刷题资源合集
  • 网站建设与管理专业好找工作吗通辽网站建设
  • QCustomPlot 特定图表类型实战
  • python 将关键数据标注在png图片里
  • python加速方法 对比 numba numb.cuda triton pycuda cupy
  • 常州天狼网站建设二手物品交换网站建设
  • 关于Java的几个小问题
  • 青岛手机网站建设手工制作月饼
  • 国外的哪个网站可以做跳转青岛网站推广途径
  • 湖北省和住房建设厅官方网站山东泰山新闻
  • 营销网站定制公司台州网站设计哪家好
  • C++——基础
  • 回顾首尔 KBW 2025,Sui 的创新与联结周
  • 2025CCPC郑州邀请赛暨河南省赛 B. 随机栈 II 题解
  • 珠海网站建设公商城二次开发