ffmpeg系列

Java使用FFmpeg(自定义cmd)
Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长
Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息(File方式)
Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息(URL方式)
Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)
Java使用FFmpeg(自定义cmd)系列之mp4转hsl编码m3u8
Java使用FFmpeg(自定义cmd)系列之MP4 转码 HLS m3u8 AES128 加密

使用ffmpeg 自定义的cmd命令获取时长,废话不多说,代码说话:
不用我们安装FFmpeg,项目自动依赖ffmpeg,已经有开源实现:https://github.com/a-schild/jave2

下面的代码基于:3.1.1 version

maven坐标:

<dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.1.1</version>
</dependency>
package com.hsj.demo;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import com.hsj.cmd.FfmpegCmd;
import com.hsj.threadpool.ThreadPoolExecutorUtils;/*** * @Description:(获取视频/音频时长---使用File文件方式)   * @author: HeShengjin* @date:   2021年6月23日 下午1:24:43    * @Copyright:*/
public class FfmpegCmdFile4DurationTest {private final static String DURATION_START = "Duration:";private final static String KEY_FOR_HOUR = "hour";private final static String KEY_FOR_MINUTE = "minute";private final static String KEY_FOR_SECONED = "seconed";private final static String KEY_FOR_MILLSECONED = "millseconed";//小时 * 60 = 分//分 * 60 = 秒private final static BigDecimal GAP_60 = new BigDecimal("60");//秒* 1000 = 毫秒private final static BigDecimal GAP_1000 = new BigDecimal("1000");/***  TYPE_0:小时*  TYPE_1:分钟*  TYPE_2:秒钟*  TYPE_3:毫秒 */public final static int TYPE_0 = 0;public final static int TYPE_1 = 1;public final static int TYPE_2 = 2;public final static int TYPE_3 = 3;//ffmpeg执行命令private final static String file_absolute_path = "I:\\荣耀视频测试.mp4";private final static String cmd_4_info = "-i $FileAbsolutePath";public static void main(String[] args) {try {System.out.println(String.format("获取时长:%s 小时", duration4File(new File(file_absolute_path),TYPE_0).doubleValue()));System.out.println(String.format("获取时长:%s 分钟", duration4File(new File(file_absolute_path),TYPE_1).doubleValue()));System.out.println(String.format("获取时长:%s 秒钟", duration4File(new File(file_absolute_path),TYPE_2).doubleValue()));System.out.println(String.format("获取时长:%s 毫秒", duration4File(new File(file_absolute_path),TYPE_3).doubleValue()));System.out.println("");System.out.println(String.format("获取时长(格式化):%s", durationFormat4File(new File(file_absolute_path))));} catch (Exception e) {e.printStackTrace();}}/*** * @Description: (获取格式化的时间duration:such as:00:01:03.32)   * @param: @param File file* @param: @return* @param: @throws Exception      * @return: BigDecimal      * @throws*/public static String durationFormat4File(final File file) throws Exception {String duration = null;Map<String,String> map = null;try {CompletableFuture<String> completableFutureTask = CompletableFuture.supplyAsync(() ->{    String durationStr = null;//执行ffmpeg命令StringBuffer sText = getErrorStreamText(cmd_4_info.replace("$FileAbsolutePath", file.getAbsolutePath()));if(null != sText && sText.indexOf(DURATION_START) > -1) {String stextOriginal = sText.toString();//正则解析时间Matcher matcher = patternDuration().matcher(stextOriginal);//正则提取字符串while(matcher.find()){//such as:00:01:03.32durationStr = matcher.group(1);break;}}return durationStr;}, ThreadPoolExecutorUtils.pool);duration = completableFutureTask.get();} catch (InterruptedException e) {Thread.currentThread().interrupt();e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return duration;}/*** * @Description: (获取时长)   * @param: @param File file ffmpeg命令,如:-i I:\\荣耀视频测试.mp4* @param: @param type 类型:*                        TYPE_0:小时*                        TYPE_1:分钟*                        TYPE_2:秒钟*                        TYPE_3:毫秒* @param: @return      * @return: BigDecimal      * @throws Exception * @throws*/public static BigDecimal duration4File(final File file, int type) throws Exception {BigDecimal duration = new BigDecimal("00");Map<String,String> map = null;try {CompletableFuture<Map<String,String>> completableFutureTask = CompletableFuture.supplyAsync(() ->{              Map<String,String> mapTmp = null;//执行ffmpeg命令StringBuffer sText = getErrorStreamText(cmd_4_info.replace("$FileAbsolutePath", file.getAbsolutePath()));if(null != sText && sText.indexOf(DURATION_START) > -1) {String stextOriginal = sText.toString();//正则解析时间Matcher matcher = patternDuration().matcher(stextOriginal);//正则提取字符串while(matcher.find()){//such as:00:01:03.32String durationStr = matcher.group(1);mapTmp = getHourMinuteSeconedMillseconed(durationStr);break;}}return mapTmp;}, ThreadPoolExecutorUtils.pool);map = completableFutureTask.get();if(null != map && map.size() > 0) {switch (type) {case TYPE_0://小时duration = duration.add(new BigDecimal(map.get(KEY_FOR_HOUR)));break;case TYPE_1://分钟duration = duration.add(new BigDecimal(map.get(KEY_FOR_HOUR)).multiply(GAP_60)).add(new BigDecimal(map.get(KEY_FOR_MINUTE)));break;case TYPE_2://秒duration = duration.add(new BigDecimal(map.get(KEY_FOR_HOUR)).multiply(GAP_60).multiply(GAP_60)).add(new BigDecimal(map.get(KEY_FOR_MINUTE)).multiply(GAP_60)).add(new BigDecimal(map.get(KEY_FOR_SECONED)));break;case TYPE_3://毫秒duration = duration.add(new BigDecimal(map.get(KEY_FOR_HOUR)).multiply(GAP_60).multiply(GAP_60).multiply(GAP_1000)).add(new BigDecimal(map.get(KEY_FOR_MINUTE)).multiply(GAP_60).multiply(GAP_1000)).add(new BigDecimal(map.get(KEY_FOR_SECONED)).multiply(GAP_1000)).add(new BigDecimal(map.get(KEY_FOR_MILLSECONED)));break;default:throw new Exception("未知的类型!");} }} catch (InterruptedException e) {Thread.currentThread().interrupt();e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return duration;}//模式public static Pattern patternDuration() {//"(?i)duration:\\s*([0-9\\:\\.]+)"-->匹配到时分秒即可,毫秒不需要return Pattern.compile("(?i)duration:\\s*([0-9\\:\\.]+)");}/*** * @Description: (获取错误流)   * @param: @param cmd_4_info* @param: @return      * @return: StringBuffer      * @throws*/private static StringBuffer getErrorStreamText(String cmdStr) {//返回的textStringBuffer sText = new StringBuffer();FfmpegCmd ffmpegCmd = new FfmpegCmd();                             try {;   //错误流InputStream errorStream = null;//destroyOnRuntimeShutdown表示是否立即关闭Runtime//如果ffmpeg命令需要长时间执行,destroyOnRuntimeShutdown = false//openIOStreams表示是不是需要打开输入输出流://         inputStream = processWrapper.getInputStream();//           outputStream = processWrapper.getOutputStream();//         errorStream = processWrapper.getErrorStream();ffmpegCmd.execute(false, true, cmdStr);errorStream = ffmpegCmd.getErrorStream();        //打印过程int len = 0;while ((len=errorStream.read())!=-1){char t = (char)len;
//                  System.out.print(t);sText.append(t);}//code=0表示正常ffmpegCmd.getProcessExitCode();} catch (IOException e) {e.printStackTrace();} finally {//关闭资源ffmpegCmd.close();}//返回return sText;}/*** * @Description: (获取duration的时分秒毫秒)   * @param: durationStr  such as:00:01:03.32* @return: Map      * @throws*/private static Map<String,String> getHourMinuteSeconedMillseconed(String durationStr){HashMap<String,String> map = new HashMap<>(4);if(null != durationStr && durationStr.length() > 0) {String[] durationStrArr = durationStr.split("\\:");String hour = durationStrArr[0];String minute = durationStrArr[1];//特殊String seconed = "00";String millseconed = "00";String seconedTmp = durationStrArr[2];if(seconedTmp.contains("\\.")) {String[] seconedTmpArr = seconedTmp.split("\\.");seconed = seconedTmpArr[0];millseconed = seconedTmpArr[1];}else {seconed = seconedTmp;}map.put(KEY_FOR_HOUR, hour);map.put(KEY_FOR_MINUTE, minute);map.put(KEY_FOR_SECONED, seconed);map.put(KEY_FOR_MILLSECONED, millseconed);}return map;}}


gitee:https://gitee.com/hsjjsh123/test-ffmpeg

Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)相关推荐

  1. Java获取视频的时长——日期时间处理

    Problem: 如何通过Java获取视频的时长? 想通过Java来获取某文件夹(或多个文件夹)下的视频的总时长 经过查询资料,发现可以通过JAVE实现:The JAVE (Java Audio Vi ...

  2. ffmpeg 获取视频的时长

    简单写个程序获取视频的时长,以便做视频播放器的进度条. 很简单,头文件我懒的敲了,直接复制别的,所以有些多余. 代码如下: #include <libavcodec/avcodec.h> ...

  3. pom.xml中java-1.0.2.jar引入并获取视频的时长、大小、格式等信息百分百可行

    java-1.0.2.jar引入并获取视频的时长.大小.格式等信息百分百可行 前言 最近因为自己在整理一个小项目(系列传送门:Spring Cloud Hoxton 版本微服务项目搭建eureka注册 ...

  4. 获取MP3音频时长 | Java工具类

    获取mp3格式音频时长. Maven依赖 <dependency><groupId>org</groupId><artifactId>jaudiotag ...

  5. vue-element上传获取视频的时长

    :before-upload的事件中 handleBeforeupload(file) { this.isStartUpload = true const isJPG = file.type === ...

  6. python中使用ffmpeg进行视频指定时长截断(解决剪切后音视频不同步的问题)

    1. 获取视频时长 有两种方式获取视频总时长: python-ffmpeg( 获取的是视频总秒数 ) video_time = float(ffmpeg.probe(video)['format'][ ...

  7. ffprobe 获取视频每秒总帧数或视频总帧数及视频总时长

    获取每秒总帧数: ffprobe -v 0 -of csv="p=0" -select_streams V:0 -show_entries stream=r_frame_rate ...

  8. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

  9. java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...

    安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...

最新文章

  1. 分享Css3设计---纯Css实现超酷的iphone玻璃气泡效果
  2. promtail 配置详解_基于loki+promtail+grafana技术的日志集合
  3. 大数据各组件环境完整安装
  4. 安卓微信自动抢红包插件优化和实现
  5. 一图掌握项目立项流程操作实例及立项评审步骤
  6. HTML制作qq空间主页
  7. 用计算机刻盘,电脑怎么刻盘_怎么将电脑桌面的文件刻录到cd光盘
  8. 【Windows安装RabbitMQ详细教程】
  9. archlinux 罗技K380 F1-F12 功能键锁定
  10. 笔记本RTX3060比2060性能高多少 RTX3060和2060笔记本差距多大
  11. 卫片图斑_整治“卫片图斑”,让违建无处可逃!
  12. Centos7防火墙与IPTABLES详解
  13. 基于FPGA的DDS 信号发生器(一)
  14. 小提琴和钢琴一起学行吗_小提琴和钢琴存在一种羁绊
  15. Unity 3D 入门基础
  16. java用模板生成word(docx)文档(含动态表格)
  17. Linux性能之CPU使用率
  18. 电脑能正常上网,但是不能连接共享的打印机 电脑无法打印 服务打开无法打印
  19. 仿优信二手车品牌选择demo
  20. 计算机网络 丨 常用的电脑CMD命令

热门文章

  1. 1,25(OH)2维生素D单克隆抗体丨D2、D3
  2. Django全栈开发学习笔记(十二)——数据的增、删、改、查
  3. 学会蒲公英Bug管理云的使用
  4. 计算机没考好的检讨1000字,期末考试没考好检讨书1000字(精选5篇)
  5. matlab newff函数弃用了,MATLAB神经网络函数NEWFF()新旧用法差异
  6. win7系统怎么连接ftp服务器失败,win7系统连接FTP服务的操作方法
  7. 咚咚咚————【封装驱动】MAX6675热电偶温度传感器,分享交流自己编写的程序。
  8. 三维空间中两次旋转等效为一次旋转的计算方法(四元数)
  9. 自己动手搞一个tip 插件
  10. 谷歌商店两大平替:适用安卓/鸿蒙党