Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)
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文件方式)相关推荐
- Java获取视频的时长——日期时间处理
Problem: 如何通过Java获取视频的时长? 想通过Java来获取某文件夹(或多个文件夹)下的视频的总时长 经过查询资料,发现可以通过JAVE实现:The JAVE (Java Audio Vi ...
- ffmpeg 获取视频的时长
简单写个程序获取视频的时长,以便做视频播放器的进度条. 很简单,头文件我懒的敲了,直接复制别的,所以有些多余. 代码如下: #include <libavcodec/avcodec.h> ...
- pom.xml中java-1.0.2.jar引入并获取视频的时长、大小、格式等信息百分百可行
java-1.0.2.jar引入并获取视频的时长.大小.格式等信息百分百可行 前言 最近因为自己在整理一个小项目(系列传送门:Spring Cloud Hoxton 版本微服务项目搭建eureka注册 ...
- 获取MP3音频时长 | Java工具类
获取mp3格式音频时长. Maven依赖 <dependency><groupId>org</groupId><artifactId>jaudiotag ...
- vue-element上传获取视频的时长
:before-upload的事件中 handleBeforeupload(file) { this.isStartUpload = true const isJPG = file.type === ...
- python中使用ffmpeg进行视频指定时长截断(解决剪切后音视频不同步的问题)
1. 获取视频时长 有两种方式获取视频总时长: python-ffmpeg( 获取的是视频总秒数 ) video_time = float(ffmpeg.probe(video)['format'][ ...
- ffprobe 获取视频每秒总帧数或视频总帧数及视频总时长
获取每秒总帧数: ffprobe -v 0 -of csv="p=0" -select_streams V:0 -show_entries stream=r_frame_rate ...
- java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...
一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...
- java在linux转化mp3,linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。...
安装ffmpeg ffmpeg -codecs -可以看出ffmpeg默认的MP3格式无法编码为其它格式[D.A.L mp3]D=解码 E=编码 A=AudioCodec L=有损压缩 需要安装lam ...
最新文章
- 分享Css3设计---纯Css实现超酷的iphone玻璃气泡效果
- promtail 配置详解_基于loki+promtail+grafana技术的日志集合
- 大数据各组件环境完整安装
- 安卓微信自动抢红包插件优化和实现
- 一图掌握项目立项流程操作实例及立项评审步骤
- HTML制作qq空间主页
- 用计算机刻盘,电脑怎么刻盘_怎么将电脑桌面的文件刻录到cd光盘
- 【Windows安装RabbitMQ详细教程】
- archlinux 罗技K380 F1-F12 功能键锁定
- 笔记本RTX3060比2060性能高多少 RTX3060和2060笔记本差距多大
- 卫片图斑_整治“卫片图斑”,让违建无处可逃!
- Centos7防火墙与IPTABLES详解
- 基于FPGA的DDS 信号发生器(一)
- 小提琴和钢琴一起学行吗_小提琴和钢琴存在一种羁绊
- Unity 3D 入门基础
- java用模板生成word(docx)文档(含动态表格)
- Linux性能之CPU使用率
- 电脑能正常上网,但是不能连接共享的打印机 电脑无法打印 服务打开无法打印
- 仿优信二手车品牌选择demo
- 计算机网络 丨 常用的电脑CMD命令
热门文章
- 1,25(OH)2维生素D单克隆抗体丨D2、D3
- Django全栈开发学习笔记(十二)——数据的增、删、改、查
- 学会蒲公英Bug管理云的使用
- 计算机没考好的检讨1000字,期末考试没考好检讨书1000字(精选5篇)
- matlab newff函数弃用了,MATLAB神经网络函数NEWFF()新旧用法差异
- win7系统怎么连接ftp服务器失败,win7系统连接FTP服务的操作方法
- 咚咚咚————【封装驱动】MAX6675热电偶温度传感器,分享交流自己编写的程序。
- 三维空间中两次旋转等效为一次旋转的计算方法(四元数)
- 自己动手搞一个tip 插件
- 谷歌商店两大平替:适用安卓/鸿蒙党