因为数据库视频表有一段时间丢失维护duration字段, 现在有需求需要用到此字段,只能再重新获取一遍, 更新表.哎!!!

先奉上
https://github.com/opensourceteams/java-maven-project/blob/master/md/video.md

pom.xml

 <!-- mp3文件支持(如语音时长)--><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifactId><version>2.0.1</version></dependency><!-- mp4文件支持(如语音时长)--><dependency><groupId>com.googlecode.mp4parser</groupId><artifactId>isoparser</artifactId><version>1.1.22</version></dependency>

单元测试

package com.opensourceteams.modules.java.util.video;import org.junit.Test;import java.io.IOException;import static org.junit.Assert.*;public class VideoUtilTest {@Testpublic void getDuration() throws IOException {String path = "/Users/liuwen/Downloads/temp/语音测试文件/xiaoshizi.mp3" ;/*path 为本地地址 */long result = VideoUtil.getDuration(path);System.out.println(result);}}

工具类

package com.opensourceteams.modules.java.util.video;import com.coremedia.iso.IsoFile;import java.io.IOException;public class VideoUtil {/*** 获取视频文件的播放长度(mp4、mov格式)* @param videoPath* @return 单位为毫秒*/public static long getMp4Duration(String videoPath) throws IOException {IsoFile isoFile = new IsoFile(videoPath);long lengthInSeconds =isoFile.getMovieBox().getMovieHeaderBox().getDuration() /isoFile.getMovieBox().getMovieHeaderBox().getTimescale();return lengthInSeconds;}/*** 得到语音或视频文件时长,单位秒* @param filePath* @return* @throws IOException*/public static long getDuration(String filePath) throws IOException {String format = getVideoFormat(filePath);long result = 0;if("wav".equals(format)){result = AudioUtil.getDuration(filePath).intValue();}else if("mp3".equals(format)){result = AudioUtil.getMp3Duration(filePath).intValue();}else if("m4a".equals(format)) {result = VideoUtil.getMp4Duration(filePath);}else if("mov".equals(format)){result = VideoUtil.getMp4Duration(filePath);}else if("mp4".equals(format)){result = VideoUtil.getMp4Duration(filePath);}return result;}/*** 得到语音或视频文件时长,单位秒* @param filePath* @return* @throws IOException*/public static long getDuration(String filePath,String format) throws IOException {long result = 0;if("wav".equals(format)){result = AudioUtil.getDuration(filePath).intValue();}else if("mp3".equals(format)){result = AudioUtil.getMp3Duration(filePath).intValue();}else if("m4a".equals(format)) {result = VideoUtil.getMp4Duration(filePath);}else if("mov".equals(format)){result = VideoUtil.getMp4Duration(filePath);}else if("mp4".equals(format)){result = VideoUtil.getMp4Duration(filePath);}return result;}/*** 得到文件格式* @param path* @return*/public static String getVideoFormat(String path){return  path.toLowerCase().substring(path.toLowerCase().lastIndexOf(".") + 1);}}
package com.opensourceteams.modules.java.util.video;import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;public class AudioUtil {/*** 获取语音文件播放时长(秒) 支持wav 格式* @param filePath* @return*/public static Float getDuration(String filePath){try{File destFile = new File(filePath);AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(destFile);AudioFormat format = audioInputStream.getFormat();long audioFileLength = destFile.length();int frameSize = format.getFrameSize();float frameRate = format.getFrameRate();float durationInSeconds = (audioFileLength / (frameSize * frameRate));return durationInSeconds;}catch (Exception e){e.printStackTrace();return 0f;}}/*** 获取mp3语音文件播放时长(秒) mp3* @param filePath* @return*/public static Float getMp3Duration(String filePath){try {File mp3File = new File(filePath);MP3File f = (MP3File) AudioFileIO.read(mp3File);MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();return Float.parseFloat(audioHeader.getTrackLength()+"");} catch(Exception e) {e.printStackTrace();return 0f;}}/*** 获取mp3语音文件播放时长(秒)* @param mp3File* @return*/public static Float getMp3Duration(File mp3File){try {//File mp3File = new File(filePath);MP3File f = (MP3File) AudioFileIO.read(mp3File);MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();return Float.parseFloat(audioHeader.getTrackLength()+"");} catch(Exception e) {e.printStackTrace();return 0f;}}/*** 得到pcm文件的毫秒数** pcm文件音频时长计算* 同图像bmp文件一样,pcm文件保存的是未压缩的音频信息。 16bits 编码是指,每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。 16000采样率 是指 1秒钟采样 16000次。常见的音频是44100HZ,即一秒采样44100次。 单声道: 只有一个声道。** 根据这些信息,我们可以计算: 1秒的16000采样率音频文件大小是 2*16000 = 32000字节 ,约为32K 1秒的8000采样率音频文件大小是 2*8000 = 16000字节 ,约为 16K** 如果已知录音时长,可以根据文件的大小计算采样率是否正常。* @param filePath* @return*/public static long getPCMDurationMilliSecond(String filePath) {File file = new File(filePath);//得到多少秒long second = file.length() / 32000 ;long milliSecond = Math.round((file.length() % 32000)   / 32000.0  * 1000 ) ;return second * 1000 + milliSecond;}
}

因为我们是根据在线url获取视频时长的
还需要再添加一步: 本地临时存储文件

 public void getDuration() throws IOException {File file = getFileByUrl("https://video-ecook.oss-cn-hangzhou.aliyuncs.com/76bd353630be47f0b5447ec06201ee56.mp4");String path = file.getCanonicalPath(); ;System.out.println(path);long result = VideoUtil.getDuration(path);System.out.println(result + "s");}
 public static File getFileByUrl(String url) throws IOException {File tmpFile = File.createTempFile("temp", ".mp4");//创建临时文件Image2Binary.toBDFile(url, tmpFile.getCanonicalPath());return tmpFile;}

之前百度又看到有方案提出用
https://blog.csdn.net/shaobo7705601/article/details/78491699
还要找到java-1.0.2.jar
但是仍然会报错it.sauronsoftware.jave.InputFormatException
没研究出来是哪里的问题
https://blog.csdn.net/weixin_30706507/article/details/99770343

有大神看到可以在下方指点指点!感谢!!!

java获取视频时长(实测可行)相关推荐

  1. java获取视频时长

    java获取视频时长 需要一个包,没有的找我要(java-1.0.2-1.0.2.jar) 一个可以通过视频的url地址或者是上传视频 文件有类型为(MultipartFile)的来获取视频的时长. ...

  2. java获取视频时长_Java获取视频的大小、时长

    前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...

  3. 通过ffmpeg获取视频时长

    通过Java获取视频时长,可以通过jave和ffmpeg这两种工具来获取,jave和ffmpeg都能拿到本地视频文件的时长,可如果是播放视频URL,就只能通过ffmpeg来获取. 现在视频文件基本上都 ...

  4. Java通过FFMPEG获取视频时长

    2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...

  5. java如何截取视频文件_Java获取视频时长及截取帧截图详解

    前言 只是最近碰到有这方面的项目需求,所以简单 Mark 下本文.下面的示例是参考过他人分享的文章,之后本人再自行实践.调整和测试过的,希望对有这方面需求的人有所帮助. 示例 添加依赖 org.byt ...

  6. java获得U盘根目录、读取图片视频头文件信息、获取视频时长

    1.获得U盘根目录,例如我们取名U盘名称为"测试U盘",一般插入U盘后,在系统的H盘 /** * 得到系统U盘根目录 */ public String findURootPath( ...

  7. uni-app小程序如何获取视频时长

    uni-app小程序如何获取视频时长 从网上搜寻了一下发现都没有单纯获取视频时长的方法,于是只能自己研究一下了 uni-app和小程序都提供了video组件,却发现并没有提供获取视频时长属性或方法, ...

  8. ffmpeg获取视频时长和分辨率

    文章目录 ffmpeg获取视频文件时长和分辨率 获取视频时长 获取视频分辨率 ffmpeg获取视频文件时长和分辨率 获取视频时长 import os import subprocess# video_ ...

  9. 文件笔记之javaCV 视频工具|获取视频时长|缩略图

    文件笔记之javaCV 视频工具|获取视频时长|缩略图) 目录 简介 依赖引入 实现 目录 简介 通过javaCV 视频工具-截取视频缩略图.获取视频属性 依赖引入 <!--javaCV 视频工 ...

最新文章

  1. 如何超越console.log并充分利用浏览器的调试控制台
  2. React Native填坑之旅--动画篇
  3. RecursionError: maximum recursion depth exceeded
  4. Git学习笔记——分支
  5. Centos 7 搭建DNS正向解析和反向解析
  6. VS2017创建Linux项目实现远程GDB调试
  7. 《cocos2d-x手机游戏开发实战》直播课程第一期介绍
  8. Python变量的复制
  9. docker 安装 mysql和Navicat Premium 远程连接
  10. Bootstrap显示或隐藏内容
  11. UCOS2_STM32移植详细过程(汇总)
  12. [转]如何使用WinPE硬盘安装Windows XP
  13. 上传文件到数据库,然后下载文件
  14. Bailian3250 字母重排【排序】
  15. pandas 中的模糊匹配
  16. EditPlus Version 3 价格 代理商 销售价格 正版软件价格
  17. android 生成车牌号,android 车牌号识别系统app源码
  18. window使用fliqlo 教程
  19. your system does not seem to be set up to build kernel modules
  20. Win11有几个版本 Windows 11各版本区别对比

热门文章

  1. 到底什么是一个网站的建站流程,其实就是关于网站的大致构造吧
  2. SyntaxError: invalid syntax 诡异的错误
  3. 为企业用户配置专有UPN后缀
  4. sqlite3: sqlite3_step 函数
  5. 基于CNN中文文本分类实战
  6. WIFI万能钥匙v4.3.10显密精简版 无需root 安卓10可用
  7. 企业年会直播方案,看完这份就够了
  8. 软件测试中的树莓酱定律
  9. C语言math.c的运用
  10. oc2020提示无法定位程序输入点?C4D可以用win10家庭版嘛?