一、背景介绍

将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 踩坑实录 近期使用总结(三)的更多相关文章

  1. ffmpeg 踩坑实录 添加实时水印(二)

    一.背景介绍 最近领导要求做一个视频录制的相关项目.其中,需要对视频文件进行添加 实时时间水印.于是,我想到了使用之前的ffmpeg来做. 二.ffmpeg实际操作 首先把需要添加水印的视频文件,上传 ...

  2. ffmpeg 踩坑实录 安装与视频切片(一)

    这段时间一直在做一个关于视频处理的项目.其中有一块需要切片相关功能.于是采用了ffmpeg来完成相关需求. 第一,ffmpeg的安装. 首先下载官方包,我这里用的是ffmpeg-release-64b ...

  3. 后端路由项目由 gulp 改为 webpack 的踩坑实录

    前言 公司有个后端路由的项目是用 gulp 作为前端自动化构建工具,最近学习了一下 webpack,深感其强大,一狠心将其改成了 webpack 构建,以下是踩坑实录. gulp 先来说说原来的架构. ...

  4. JAVA实用案例之文件导出(JasperReport踩坑实录)

    写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...

  5. JasperReport报表导出踩坑实录

    写在最前面 翻了翻博客,因为太忙,已经好久没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六月份的时候写过一篇利用poi文件导入导出的小De ...

  6. (最新)VS2015安装以及卸载过程——踩坑实录

    前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...

  7. HashMap踩坑实录——谁动了我的奶酪

    说到HashMap,hashCode 和 equals ,想必绝大多数人都不会陌生,然而你真的了解这它们的机制么?本文将通过一个简单的Demo还原我自己前不久在 HashMap 上导致的线上问题,看看 ...

  8. Ubuntu14.04安装PowerDNS踩坑实录

    公司要使用PowerDNS,作为内网域名解析的工具.让我和另一组的同事学一下如何配置及调优.所以先找了两台服务器试着安装一下.这一装就是一个礼拜,经历了大大小小的坑,记下来以后可能需要参考.安装过程如 ...

  9. H5 video踩坑实录

    前段时间公司APP做了一个APP论坛会议,嵌入了h5播放器.我以为很简单,没想到,这正是我踩进泥潭的开始... (想要吸取经验的小伙伴可以慢慢往下看,想要解决方案的直接看最后!) 一.一开始我以为直接 ...

随机推荐

  1. nextjs-demo

    这个是根据nextjs服务端渲染做的一个小demo 关键性代码,主要是控制模态框显示隐藏 关于index页面 //index.js /* eslint-disable jsx-a11y/anchor- ...

  2. HDU 1686 Oulipo (可重叠匹配 KMP)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. HDU 2072(字符串的流式操作,学习了)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2072 单词数 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  4. stateless 无状态组件

    使用:

  5. Python 基础 Dict 和 Set 类型

    python 什么是dict 例如: d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } 我们把名称称为key,对应的成绩称为value,dic就是通过key 来查找 ...

  6. WebGl 利用drawArrays、drawElements画三角形

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. gulp之几个常用插件介绍

    今天给大家分享一篇gulp几款插件的使用 以下代码用到得模块加载‘ const gulp=require("gulp"); const gulpSass=require(" ...

  8. PHP 好用第三方库

    PHP 好用第三方库 whoops 更好的php错误报告库 [github]:https://github.com/filp/whoops Whoops是一个易于处理和调试错误的PHP库 .它提供基于 ...

  9. Flash的swf文件破解

    1.准备好flash文件,xxx.swf(后缀为swf),将其重构swf文件为fla源文件. 2.asv软件(5以上版本)的操作 1.点击左上角 文件 --> 打开 --> 运行已准备好的 ...

  10. Linux单用户CS模型TCP通讯完全注释手册

    Linux单用户CS模型TCP通讯完全注释手册 server 描述 实现一个简单的Linux单用户CS通讯,客户端发送一串字符串,服务器将其转换为大写后返回. server 代码 ``` #inclu ...