一个在linux环境执行io操作的bug
今天项目有了一个奇葩的要求。。。是什么呢
后台上传了视频后,解析其中的时长,和预览图,并拼接在一起,然而,之东西并不是太麻烦,很快写好了,在本地测试后也没有问题,嗯,发布到测试环境后,一个jar包报错,看到这想想今天要加班了\/..\/
出现的错误是javacv解析视频后,一个jni错误/home/travis/build/javacpp-presets/opencv/cppbuild/linux-x86_64/opencv-3.4.2/modules/videostab/src/frame_source.cpp:71: error: (0:No Error) can't open file:
在git的lssues提交了一个问题后,很快有大佬跟我交流了,也就是基本说说,你怎么使用的,并没有解决我的问题
总不能晾着啊,所以苦逼的我,到ffmpeg官网下载了他们的源码,在linux编译了有半小时,总算完成了,在我 的window上同样装了一个环境,
下面是我的一个错误代码,在linux上获取一个视频的时长,嗯没问题,放到环境后,打印日志后什么都没有发生。。。。。。。。。。。
public static int getliunxFileLenth(String fileName) throws InterruptedException {
String command = "ffmpeg -i "+fileName+" 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//";
Runtime rt = Runtime.getRuntime();
InputStream inputStream = null;
Process proc = null;
String line = null;
BufferedReader reader=null;
try {
proc = rt.exec(command); inputStream = proc.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream)); while ((line = reader.readLine()) != null){
line = line;
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
} return DateUtil.getSecond(line);
}
先说下出现这种问题的原因是什么把,第一,ffmpeg使用异步io处理文件的,所以,
proc = rt.exec(command);这种方式只是给系统一个通知,,
第二,window与liunx不同的地方是,处处是阻塞,linux之所以能很好的完成大并发,靠的就是异步io,
而window之所以图形界面做的好,是因为,系统之间的阻塞通知,可以让系统运行在一个流程中。 解决的办法就是让通知阻塞我们的程序,
public static int getliunxFileLenth(String fileName) throws InterruptedException {
List<String> commands = new ArrayList<>();
commands.add("ffmpeg");
commands.add("-i");
commands.add(fileName);
try {
ProcessBuilder builder = new ProcessBuilder();
int time = 0;
builder.command(commands);
Process p = builder.start(); //从输入流中读取视频信息
BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
stringBuilder.append(line);
}
p.waitFor();//阻塞
br.close(); //从视频信息中解析时长
String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s"; 。。。。。。。。。。。。
.waitFor();//阻塞
一个在linux环境执行io操作的bug的更多相关文章
- Linux之执行命令操作20170330
介绍一下Linux系统中的代码执行shell等命令的几种操作方式: 一.标准流管道popen 该函数的原型是FILE * popen(const char* command, const char * ...
- Linux 设备驱动IO操作
每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类. 根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方 ...
- jmeter Linux环境执行总报错 cannot allocate memory
1.windows环境写好的测试用例,执行没有问题,在Linux环境跑总是报错,提示如下 cannot allocate memory 2.一开始以为是哪块设置有问题,因为脚本里边有设置邮件自动发送, ...
- Linux文件的IO操作 一
系统调用 系统调用: 操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务 为什么用户程序不能直接访问系统内核提供的服务 为了更好地保护内核空间, ...
- PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)
源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...
- Linux学习记录--文件IO操作相关系统编程
文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...
- 深入理解JAVA I/O系列六:Linux中的IO模型
IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...
- 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...
- 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页
协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...
随机推荐
- [MySQL Tips]:如何删除unique key约束
[场景]: 假设最初创建了一个表bank,在street属性上添加了unique约束. create table branch( branch_name ) not null primary key, ...
- NETSDK1061错误解决
NETSDK1061错误解决 在vs生成和运行都正常,发布的时候报错 .netcore控制台项目引用另一个类库 错误信息 NETSDK1061: 项目是使用 Microsoft.NETCore.App ...
- Asp.Net Web Api中使用Swagger
关于swagger 设计是API开发的基础.Swagger使API设计变得轻而易举,为开发人员.架构师和产品所有者提供了易于使用的工具. 官方网址:https://swagger.io/solutio ...
- 一般处理程序获取Layui上传的图片
asp.net利用一般处理程序获取用户上传的图片,上传图片利用的layui 前台页面 <%@ Page Language="C#" AutoEventWireup=" ...
- .Net Core + NGINX跳转登录时端口丢失
使用.Net Core + NGINX部署到服务器的时候,如果端口不是使用默认的80端口,在跳转到登录页面时,URL中的端口丢失. NGINX的配置如下: server { listen ; loca ...
- 为什么不能用Abort退出线程
在使用线程时,如果线程还未结束直接退出线程很有可能会导致数据丢失. class threadAbort { static void Main(string[] args) { WriteMessage ...
- linux 修改MTU值
Linux系统还可以通过如下方式查看.修改MTU值. 查看:cat /sys/class/net/eth0/mtu 设置:echo "1460" > /sys/class/n ...
- C++ malloc 和 new 的函数说明
malloc 和 new 一些不同点 1. 数组变量的申请 int *p = (int *) malloc (sizeof(int) * 5); if(p==NUILL) return; free ...
- RabbitMQ - Start Up
开始之前 rabbitmq是一个被广泛使用的消息队列,它是由erlang编写的,根据AMQP协议设计实现的. AMQP的主要特征是面向消息.队列.路由(包括点对点和发布/订阅).可靠性.安全. Rab ...
- 【LeetCode】462. 最少移动次数使数组元素相等 II
给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2,3] 输出: 2 说明: 只 ...