博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个在linux环境执行io操作的bug
阅读量:6082 次
发布时间:2019-06-20

本文共 2467 字,大约阅读时间需要 8 分钟。

今天项目有了一个奇葩的要求。。。是什么呢

后台上传了视频后,解析其中的时长,和预览图,并拼接在一起,然而,之东西并不是太麻烦,很快写好了,在本地测试后也没有问题,嗯,发布到测试环境后,一个jar包报错,看到这想想今天要加班了\/..\/

出现的错误是javacv解析视频后,一个jni错误

在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
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();//阻塞
 

转载于:https://www.cnblogs.com/dmeck/p/9457120.html

你可能感兴趣的文章
IOS 消息推送---服务端.p12证书的生成
查看>>
mysql中将一个数据类型转换成另外的数据类型?mysql中cast函数的使用?
查看>>
URI URL URN
查看>>
获取当前进程的寄存器内容
查看>>
HDU 3642 Get The Treasury (线段树扫描线)
查看>>
AWK
查看>>
alpha 10
查看>>
C++中线程使用与参数传递
查看>>
VirtualBox中安装CentOS(新手教程)
查看>>
HTTP 请求头中的 X-Forwarded-For,X-Real-IP
查看>>
SDUT OJ 数据结构上机测试1:顺序表的应用
查看>>
d3----line_color_gradient 学习记录
查看>>
矩阵运算 【微软面试100题 第四十五题】
查看>>
E: Sub-process /usr/bin/dpkg returned an error code (1)
查看>>
Openshift 部署第一个应用hello-openshift
查看>>
XML学习总结
查看>>
如何利用EnteLib Unity Interception Extension 和PIAB实现Transaction
查看>>
Django中ORM介绍和字段及其参数
查看>>
[汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写
查看>>
【并查集合并注意!!!!】【最小生成树】
查看>>