<dependency> <groupId>com.googlecode.mp4parser</groupId> <artifactId>isoparser</artifactId> <version>1.1.18</version> </dependency>
import org.junit.Test;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class DownUtil {
public static boolean httpDownload(String httpUrl, String saveFile) throws IOException {
// 1.下载网络文件
int byteRead;
URL url;
try {
url = new URL(httpUrl);
} catch (MalformedURLException e1) {
e1.printStackTrace();
return false;
}
try {
//2.获取链接
URLConnection conn = url.openConnection();
//3.输入流
InputStream inStream = conn.getInputStream();
File tmpFile = File.createTempFile("temp", ".mp4");//创建临时文件
//3.写入文件
FileOutputStream fs = new FileOutputStream(tmpFile);
tmpFile.getCanonicalPath();
byte[] buffer = new byte[1024];
while ((byteRead = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, byteRead);
}
inStream.close();
fs.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Test
public void httpDownload() throws IOException {
httpDownload("https://mv01.jiaoliuqu.com/cn.taqu.test_iOS_video_106_1647230676597_25415.mp4","D:/22.mp4");
}
}
package cn.taqu.risk.review.common.utils;
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;
}
}
package cn.taqu.risk.review.common.utils;
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("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("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 cn.tq.risk.review;
import cn.taqu.risk.review.common.utils.VideoUtil;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class VideoUtilTest {
@Test
public void getDuration() throws IOException {
File file = getFileByUrl("https://mv01.jiaoliuqu.com/cn.taqu.test_iOS_video_106_1647230676597_25415.mp4");
String path = file.getCanonicalPath();
;
System.out.println(path);
/*path 为本地地址 */
long result = VideoUtil.getDuration(path);
System.out.println(result);
}
//
// public void getDuration() throws IOException {
//
//
// long result = VideoUtil.getDuration(path);
// System.out.println(result + "s");
// }
public static File getFileByUrl(String url) throws IOException {
File tmpFile = File.createTempFile("temp", ".mp4");//创建临时文件
// tmpFile.re
// Image2Binary.toBDFile(url, tmpFile.getCanonicalPath());
return tmpFile;
}
}