一、背景介绍

将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. Apache PDFbox开发指南之PDF文档读取

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...

  2. PHP去重可用

    //国外 $arr6 = array_merge($arr2,$arr4); $arr8 = array(); $arr10 = array(); foreach($arr6 as $k6=> ...

  3. mysql自增ID过大修改方法

    执行sql: alter table table_name AUTO_INCREMENT=100

  4. Xcode 错误收集及解决办法

    1.An unknown error occurred. 如果仅仅提示“An unknown error occurred.” 而没有别的提示,很有可能是设备内存已满,没有足够的空间来安装这个应用. ...

  5. djb2:一个产生简单的随机分布的哈希函数

    目录 LCG算法 示例代码 djb2 示例代码 为什么选择参数33和 33 was chosen because: 5381 was chosen because 哈希选择参考 LCG算法 djb2与 ...

  6. SharePoint客户端对象模型—任务日历生成

    1,憋了好几天在经理帮助下用Js根据任务列表,生成的个人任务日历. (1)需要用到的CSS样式 <style type="text/css"> th.ms-vh { c ...

  7. windows10 通过命令行来查看wifi密码

    c:\Windows\System32>netsh netsh>wlan show profile 接口 WLAN 上的配置文件: 组策略配置文件(只读) ---------------- ...

  8. CentOS6.10安装详解

    一.简介 CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterpriser ...

  9. 二进制mysql安装相关知识

    建议安装5.x版本 高版本没安装经验的慎用 1.1 关闭防火墙systemctl stop firewalld.service #停止firewall#慎用 systemctl disable fir ...

  10. (二)ubuntu下安装Amd RX470驱动

    0X:ADM官方下载驱动 https://www.amd.com/en/support 查看本机驱动命令 lspci | grep -i vga 选择自己的驱动 下载对应的版本 现在最新的是:amdg ...