java获取视频时长(实测可行)
因为数据库视频表有一段时间丢失维护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获取视频时长(实测可行)相关推荐
- java获取视频时长
java获取视频时长 需要一个包,没有的找我要(java-1.0.2-1.0.2.jar) 一个可以通过视频的url地址或者是上传视频 文件有类型为(MultipartFile)的来获取视频的时长. ...
- java获取视频时长_Java获取视频的大小、时长
前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...
- 通过ffmpeg获取视频时长
通过Java获取视频时长,可以通过jave和ffmpeg这两种工具来获取,jave和ffmpeg都能拿到本地视频文件的时长,可如果是播放视频URL,就只能通过ffmpeg来获取. 现在视频文件基本上都 ...
- Java通过FFMPEG获取视频时长
2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...
- java如何截取视频文件_Java获取视频时长及截取帧截图详解
前言 只是最近碰到有这方面的项目需求,所以简单 Mark 下本文.下面的示例是参考过他人分享的文章,之后本人再自行实践.调整和测试过的,希望对有这方面需求的人有所帮助. 示例 添加依赖 org.byt ...
- java获得U盘根目录、读取图片视频头文件信息、获取视频时长
1.获得U盘根目录,例如我们取名U盘名称为"测试U盘",一般插入U盘后,在系统的H盘 /** * 得到系统U盘根目录 */ public String findURootPath( ...
- uni-app小程序如何获取视频时长
uni-app小程序如何获取视频时长 从网上搜寻了一下发现都没有单纯获取视频时长的方法,于是只能自己研究一下了 uni-app和小程序都提供了video组件,却发现并没有提供获取视频时长属性或方法, ...
- ffmpeg获取视频时长和分辨率
文章目录 ffmpeg获取视频文件时长和分辨率 获取视频时长 获取视频分辨率 ffmpeg获取视频文件时长和分辨率 获取视频时长 import os import subprocess# video_ ...
- 文件笔记之javaCV 视频工具|获取视频时长|缩略图
文件笔记之javaCV 视频工具|获取视频时长|缩略图) 目录 简介 依赖引入 实现 目录 简介 通过javaCV 视频工具-截取视频缩略图.获取视频属性 依赖引入 <!--javaCV 视频工 ...
最新文章
- 如何超越console.log并充分利用浏览器的调试控制台
- React Native填坑之旅--动画篇
- RecursionError: maximum recursion depth exceeded
- Git学习笔记——分支
- Centos 7 搭建DNS正向解析和反向解析
- VS2017创建Linux项目实现远程GDB调试
- 《cocos2d-x手机游戏开发实战》直播课程第一期介绍
- Python变量的复制
- docker 安装 mysql和Navicat Premium 远程连接
- Bootstrap显示或隐藏内容
- UCOS2_STM32移植详细过程(汇总)
- [转]如何使用WinPE硬盘安装Windows XP
- 上传文件到数据库,然后下载文件
- Bailian3250 字母重排【排序】
- pandas 中的模糊匹配
- EditPlus Version 3 价格 代理商 销售价格 正版软件价格
- android 生成车牌号,android 车牌号识别系统app源码
- window使用fliqlo 教程
- your system does not seem to be set up to build kernel modules
- Win11有几个版本 Windows 11各版本区别对比