视频解析工具类

<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;
    }

}

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南无南有

为绿色加绿叶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值