1. 前言

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

2.1 实现格式转换功能

该方法就设置了一个入参,即文件路径。参数ffmpegPath是@value引入的yml配置,如下图

指向的路径下放入FFmpeg的.exe文件即可。

    @Value("${ffmpeg.path}")String ffmpegPath;public  String transCoding(String path) throws IOException {String ffmpegExePath = new ClassPathResource(ffmpegPath+"/ffmpeg.exe").getAbsolutePath();ArrayList<String> command = new ArrayList<>();command.add(ffmpegExePath);command.add("-i");command.add(path);command.add("-vcodec");command.add("copy");command.add("-f");command.add("mpegts");String s = "E:\\data\\split\\" + IdUtil.simpleUUID() + ".mp4";command.add(s);// 执行操作ProcessBuilder builder = new ProcessBuilder();builder.command(command);builder.redirectErrorStream(true);Process process = builder.start();return s;}

2.2 实现视频剪辑

 public String videoSpit(String path, String startTime, String duration) throws IOException {int i = Integer.parseInt(startTime) / 1000;int i1 = Integer.parseInt(duration) / 1000;String ffmpegExePath = new ClassPathResource(ffmpegPath +"/ffmpeg.exe").getAbsolutePath();List<String> command = new ArrayList<>();command.add(ffmpegExePath);command.add("-ss");command.add(String.valueOf(i));command.add("-t");command.add(String.valueOf(i1));command.add("-accurate_seek");command.add("-i");if (!FileUtil.file(path).isFile()) {return "文件不存在,请检查!!";}command.add(path);command.add("-codec");command.add("copy");command.add("-avoid_negative_ts");command.add("1");String s = IdUtil.simpleUUID();//本地开发写死路径String substring = path.substring(path.lastIndexOf("."));String e1 = "E:\\data\\split\\" + s + path.substring(path.lastIndexOf("."));StringBuilder stringBuffer = new StringBuilder();//业务需求,判断是否为mp4,如不需要可以去掉if (!"mp4".equals(substring)) {String s1 = transCoding(e1);command.add(s1);stringBuffer.append(s1);}else {command.add(e1);stringBuffer.append(e1);}try {System.out.println(command);ProcessBuilder builder = new ProcessBuilder();builder.command(command);//正常信息和错误信息合并输出builder.redirectErrorStream(true);//开始执行命令Process process = builder.start();//如果你想获取到执行完后的信息,那么下面的代码也是需要的StringBuilder sbf = new StringBuilder();String line;BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));while ((line = br.readLine()) != null) {sbf.append(line);sbf.append(" ");}String resultInfo = sbf.toString();System.out.println(resultInfo);System.out.println(stringBuffer);return stringBuffer.toString();} catch (IOException e) {e.printStackTrace();}return "操作失败";}

path 是文件路径,startTime是开始时间,duration是持续时间,我这里传入的时间是ms,所以先转换成s。方便FFmpeg处理

2.3 实现对指定区域的裁剪并切割

public void spit(String filePath, Integer startTime, String location, String continuous, Integer number) throws IOException {ArrayList<String> command = new ArrayList<>();DecimalFormat df = new DecimalFormat("0.00");StringBuilder stringBuffer = new StringBuilder();for (int i = 0; i < number; i++) {command.add("E:\\data\\ffmpeg.exe");command.add("-ss");String format = df.format((float) i / number + startTime);System.out.println("开始时间" + format);command.add(String.valueOf(format));command.add("-i");command.add(filePath);command.add("-strict");command.add("-2");command.add("-vf");command.add(location);command.add("-t");command.add(continuous);String s = "E:\\data\\spit-test\\2s\\" + format + ".mp4";System.out.println(s);command.add(s);ProcessBuilder builder = new ProcessBuilder();builder.command(command);System.out.println(command);builder.redirectErrorStream(true);Process process = builder.start();command.removeAll(command);StringBuilder sbf = new StringBuilder();String line;BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));while ((line = br.readLine()) != null) {sbf.append(line);sbf.append(" ");}String resultInfo = sbf.toString();System.out.println(resultInfo);System.out.println(stringBuffer);}}

filePath 文件路径
startTime 开始时间(单位/s)
location 裁剪的位置,格式如:crop=w=100:h=100:x=12:y=34 ,其中w和h指的是裁剪完的帧宽度和帧高度,x和y指裁剪的坐标点,裁剪时会按照该点坐标往右下裁剪。
continuous 持续时间
number 颗粒度 该参数是业务为需求定制,因为我需要按照业务会把视频以0.1s、0.01s切片,则此参数影响for循环次数,根据具体业务修改

截取前:

截取后:

Java 调用ffmpeg 实现视频编辑相关推荐

  1. mysql+视频文件转成流_详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:W ...

  2. Java调用ffmpeg进行视频.H264抽帧,并保存为图片

    Java调用ffmpeg进行视频.H264抽帧,并保存为图片 1. 需求 2. 解决 3. 源码 参考 1. 需求 对视频 D:\data\01-test.H264进行抽帧并保存为图片,图片命名为1. ...

  3. Java调用FFmpeg实现视频录制

    FFmpeg是一个很好用的开源的视频处理工具,网上也有一些java调用FFmpeg的方法,然而这些文章大部分都有一个共同的特点,就是用java去调用FFmpeg去做视频处理,几乎没有去做录制视频和音频 ...

  4. Java调用ffmpeg实现视频转gif、webp动图

    安装ffmpeg linux环境 yum install epel-release -y #查看centos版本 cat /etc/redhat-release #由于CentOS没有官方FFmpeg ...

  5. java flv转mp3_Java调用ffmpeg转换视频格式为flv的示例详解

    这篇文章主要介绍了 详解java调用ffmpeg转换视频格式为flv的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下 详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在L ...

  6. java调用ffmepg_java调用ffmpeg施行视频转换

    java调用ffmpeg执行视频转换 用java小例题说明更直观:(可以直接编译运行) 环境我在windows平台下测试的... 需要在e:\下有ffmpeg.exe;mencoder.exe;drv ...

  7. JAVA调用FFmpeg实现音视频转码加水印功能

    目录 目录 写在前面 MAVEN引用 获取音视频基本信息 音频转码成Mp3格式 视频转码成Mp4格式 视频转码成Mp4并添加文字水印 视频转码成Mp4并添加图片水印 测试代码 写在前面 如今各大云厂商 ...

  8. java命令截图,GitHub - xuege-cn/fmj: FMJ (FFMpeg for Java)。通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息、截图等等)。...

    项目介绍 FMJ (FFMpeg for Java) 通过Java调用FFMpeg命令的方式来对音视频进行处理(获取信息.截图等等). FFMpeg安装 建议使用 ffmpeg-2.6.1 版本 Li ...

  9. java调用ffmpeg把rtsp视频流保存为MP4文件

    前言:最近需要把rtsp的视频流保存为MP4文件(就是录制直播流).刚开始用的javacv的FFmpegFrameGrabber和FFmpegFrameRecorder,但是声音流和视频流无法调整,声 ...

最新文章

  1. 三星对外发售高性能芯片,华为上升势头或受重击!
  2. 人人出售56不亏:三方得利
  3. LeetCode Majority Element
  4. maven 插件在线安装
  5. Ubuntu首次开启root用户
  6. wordpress漏洞_WordPress XSS漏洞可能导致远程执行代码(RCE)
  7. java将图片传给页面,java将图片传为设定编码值显示(可做刺绣)
  8. nginx ci index.php,CI在Nginx服务器上rewrite去掉index.php例子
  9. JQuery 各节点获取函数:父节点,子节点,兄弟节点
  10. 编程—休息片刻的好处
  11. Jquery基础概括
  12. 视频描述(Video Captioning)调研
  13. 作业车间调度问题特征与调度效率相关性的研究Correlation of job-shop scheduling problem features with scheduling efficiency
  14. 原生JS实现旋转轮播图+文字内容切换
  15. 第二节 数值、字符与字符串
  16. mysql的sql分页查询语句怎么写_sql 分页查询语句(mysql分页语句)
  17. C/C++面试宝典2020版(最新版)
  18. sat数学逻辑推理题解题方法
  19. Chapter9:Simulink建模与仿真
  20. 西门子plc与ABB510变频器modbus通讯

热门文章

  1. Kaggle数据集之电信客户流失数据分析(三)之决策树分类
  2. 通信教程 | 概述第一、二、三代CAN总线
  3. php微信公众号支付实例教程,PHP微信公众号支付教程(含图文)
  4. 教你分析快递揽收后,第二条物流是否超过12小时
  5. 三森すずこさん コール・曲色 '17.04
  6. 全球最受欢迎电商平台有哪些?这些平台怎么快速增加销量?
  7. 2018FME博客大赛-基于FME的不同比例尺线面要素 一致性检测关键技术研究
  8. WeGame聊天室采集
  9. 收藏:青春,最美!哈理工学子合唱《我的骄傲》(原唱杨培安)
  10. 语法基础——C语法基础