ffmpeg 踩坑实录 近期使用总结(三)
一、背景介绍
将ffmpeg运用到项目上已经有一段时间了,趁现在有空赶紧记下来。
二、技术点总结
2.1 实现方式
项目里面主要运用的形式是,在java端,调用操作系统的方法,并执行切片命令。
在执行切片之前,出于对代码的健壮性考虑,一般会下意识地对文件和目标地址进行检查和创建路径。
这里除了,判断传入的String对象是否为空之外,还需要对实际的文件进行判断以及目标地址的路径是否存在。这样可以在发布上线之后避免很多问题。
2.2 时长的获得
除了切片还需要,统计被切片的文件时长,这个是后来的需求。针对这个问题,有两种解决方案,一种是调用以下两个依赖包
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
即使用jave的包去解决,但实际原理也是使用ffmpeg的方式去截取时间长短。我使用过这个方案,除了遇到了maven库下载不到,并且需要自己去官网下载,并上传到本地库这一系列操作之后,我仍然遇到了时不时的空指针异常。
这个错误,让我很抓狂,尤其这个jave这个东西我并不熟悉的情况下。第二种方案,偶然的情况下 我执行ffmpeg命令的时候发现

其实是有duration 这个数值的。那么我当时就想,是不是我执行命令并把返回的内容进行截取,再转换我就可以得到视频的时长。于是这就是第二个方案,并且已经在使用了。这个方法更加稳定,并且依赖性更少。、
2.3 切片请求的实现
其实切片这个操作,主要是对cpu 有高的要求,同时系统又要求实时。所以我采取的办法,是通过nginx 来分发切片的请求,并且把切片服务独立出来,并用线程池的方式来实现。
这样,需要切片的主业务程序,只需要将切片的相关参数发给切片服务,切片服务接受到参数之后立即返回接受成功,等到切片完成之后,再回调主业务的结果接收接口即可。说起来负责,画图就很简单,见下图:

在发送切片请求的时候,实际上是被nginx拦截的,然后平均转发到几台后台切片服务,这样子就可以避免大量的切片任务会导致单点切片直接卡死(具体表现就是切片切到一定程度,就停止了,我还没找到具体原因,但是我怀疑跟linux 最大文件数限制有有关系)。
这里要注意监控服务器的cpu相关属性 (top 、sar -u)等
2.4 结果的记录
在之前的方案中,实际上只采取的各个切片服务直连数据库的方式。当完成切片任务之后,就直接连数据库去修改。后来,我想了一下,这个方案是有问题的,尤其是在多点部署的情况下。如果同样的切片请求,被请求两次,并且被转发到不同的节点,这样子不仅切片相互会干扰,同时,在去数据库记录update的时候,有可能会导致死锁。后来将这个方式改为回调接口,把连接数据库的session归拢到主业务中去。
2.5 待完善
事实上,这个业务模块还有很多需要完善的,比如系统的资源监控防止异常的任务波动,日志报警,消息队列来接受切片请求,并且防止重复执行切片任务以及最重要的 切片优化(语句的优化以及 后期考虑上GPU的想法)等。还有,在返回的时候标记这个任务是哪台机器执行的。这样更好的方便,事后,去追溯问题的原因。
三、总结
做完这个项目之后,越发地感觉把任务拆分成为一个一个简单的单元的重要性(WBS)。构建高内聚,低耦合的系统,也不再是一句口号。是需要认真去思考的,并且一个无法回避的问题。
ffmpeg 踩坑实录 近期使用总结(三)的更多相关文章
- ffmpeg 踩坑实录 添加实时水印(二)
一.背景介绍 最近领导要求做一个视频录制的相关项目.其中,需要对视频文件进行添加 实时时间水印.于是,我想到了使用之前的ffmpeg来做. 二.ffmpeg实际操作 首先把需要添加水印的视频文件,上传 ...
- ffmpeg 踩坑实录 安装与视频切片(一)
这段时间一直在做一个关于视频处理的项目.其中有一块需要切片相关功能.于是采用了ffmpeg来完成相关需求. 第一,ffmpeg的安装. 首先下载官方包,我这里用的是ffmpeg-release-64b ...
- 后端路由项目由 gulp 改为 webpack 的踩坑实录
前言 公司有个后端路由的项目是用 gulp 作为前端自动化构建工具,最近学习了一下 webpack,深感其强大,一狠心将其改成了 webpack 构建,以下是踩坑实录. gulp 先来说说原来的架构. ...
- JAVA实用案例之文件导出(JasperReport踩坑实录)
写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...
- JasperReport报表导出踩坑实录
写在最前面 翻了翻博客,因为太忙,已经好久没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六月份的时候写过一篇利用poi文件导入导出的小De ...
- (最新)VS2015安装以及卸载过程——踩坑实录
前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...
- HashMap踩坑实录——谁动了我的奶酪
说到HashMap,hashCode 和 equals ,想必绝大多数人都不会陌生,然而你真的了解这它们的机制么?本文将通过一个简单的Demo还原我自己前不久在 HashMap 上导致的线上问题,看看 ...
- Ubuntu14.04安装PowerDNS踩坑实录
公司要使用PowerDNS,作为内网域名解析的工具.让我和另一组的同事学一下如何配置及调优.所以先找了两台服务器试着安装一下.这一装就是一个礼拜,经历了大大小小的坑,记下来以后可能需要参考.安装过程如 ...
- H5 video踩坑实录
前段时间公司APP做了一个APP论坛会议,嵌入了h5播放器.我以为很简单,没想到,这正是我踩进泥潭的开始... (想要吸取经验的小伙伴可以慢慢往下看,想要解决方案的直接看最后!) 一.一开始我以为直接 ...
随机推荐
- Owin+ASP.NET Identity浅析系列(五)接入第三方登录
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… OK,用户角色实现后,我们回 ...
- shell脚本执行
方法一:切换到shell脚本所在的目录执行shell脚本: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应 ...
- logback将日志写入不同文件夹里
转载:logback不同业务的日志打印到不同文件 一.logback.xml文件配置如下: <?xml version="1.0" encoding="UTF-8& ...
- nginx中文文档
http://www.nginx.cn/doc/ LNMP :https://lnmp.org/faq/lnmp-vhost-add-howto.html 配置详解 配置详解2
- Spring @Value 默认值
@Value(value = "${etl.maxthreadcount:3}") private long MaxThreadCount;
- geomesa hbase geoserver
在geoserver中配置hbase ln -s /root/hbase/hbase-1.4.8/conf/hbase-site.xml /root/tomcat/apache-tomcat-7.0. ...
- SSAS 度量值中的distinct count局聚合方式会数为null的值
我们来看一个例子 Analysis Services: For Distinct Count measure NULL = 0 If you are to look at the table of v ...
- 浅谈ES6基础——Promise
IMAGE加载 Callback Hell function loadImg(src,callback,fail) { var img = document.createElement('img'); ...
- 今天在Qt子界面中的Button,转到槽转不过去,报错Qt The class containing 'Ui::MainWindow' could not be found in...
在网上查了原因,因为我在修改button的名字时,没选中button,选中了子界面对话框Dialog,然后修改了名字,又没有改回去,所以button转到槽报错. 参考网站: https://zhida ...
- IO流C++
1.iostream处理控制台IO #include<iostream> #include<string> using namespace std; istream& ...