• java 读取音频/视频 文件时长


    java 读取音频/视频 文件时长

    • 支持mp3,mp4,mov,m4a,wav 格式文件

    源码

    pom文件

     1   <!-- mp3文件支持(如语音时长)-->
     2     <dependency>
     3       <groupId>org</groupId>
     4       <artifactId>jaudiotagger</artifactId>
     5       <version>2.0.1</version>
     6     </dependency>
     7  
     8     <!-- mp4文件支持(如语音时长)-->
     9     <dependency>
    10       <groupId>com.googlecode.mp4parser</groupId>
    11       <artifactId>isoparser</artifactId>
    12       <version>1.1.22</version>
    13     </dependency>

    工具类

      1 package com.puxinwangxiao.mts.util;
      2 
      3 
      4 import com.coremedia.iso.IsoFile;
      5 
      6 import java.io.File;
      7 import java.io.IOException;
      8 import java.net.UnknownHostException;
      9 
     10 
     11 public class VideoUtil {
     12 
     13 
     14     /**
     15      * 获取视频文件的播放长度(mp4、mov格式)
     16      * @param videoPath
     17      * @return 单位为毫秒
     18      */
     19     public static long getMp4Duration(String videoPath) throws IOException {
     20         IsoFile isoFile = new IsoFile(videoPath);
     21         long lengthInSeconds =
     22                 isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
     23                         isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
     24         return lengthInSeconds;
     25     }
     26 
     27 
     28     /**
     29      * 得到语音或视频文件时长,单位秒
     30      * @param filePath
     31      * @return
     32      * @throws IOException
     33      */
     34     public static long getDuration(String filePath) throws IOException {
     35         String format = getVideoFormat(filePath);
     36         long result = 0;
     37         if("wav".equals(format)){
     38             result = AudioUtil.getDuration(filePath).intValue();
     39         }else if("mp3".equals(format)){
     40             result = AudioUtil.getMp3Duration(filePath).intValue();
     41         }else if("m4a".equals(format)) {
     42             result = VideoUtil.getMp4Duration(filePath);
     43         }else if("mov".equals(format)){
     44             result = VideoUtil.getMp4Duration(filePath);
     45         }else if("mp4".equals(format)){
     46             result = VideoUtil.getMp4Duration(filePath);
     47         }
     48 
     49         return result;
     50     }
     51 
     52     /**
     53      * 得到语音或视频文件时长,单位秒
     54      * @param filePath
     55      * @return
     56      * @throws IOException
     57      */
     58     public static long getDuration(String filePath,String format) throws IOException {
     59         long result = 0;
     60         if("wav".equals(format)){
     61             result = AudioUtil.getDuration(filePath).intValue();
     62         }else if("mp3".equals(format)){
     63             result = AudioUtil.getMp3Duration(filePath).intValue();
     64         }else if("m4a".equals(format)) {
     65             result = VideoUtil.getMp4Duration(filePath);
     66         }else if("mov".equals(format)){
     67             result = VideoUtil.getMp4Duration(filePath);
     68         }else if("mp4".equals(format)){
     69             result = VideoUtil.getMp4Duration(filePath);
     70         }
     71 
     72         return result;
     73     }
     74 
     75 
     76     /**
     77      * 得到文件格式
     78      * @param path
     79      * @return
     80      */
     81     public static String getVideoFormat(String path){
     82         return  path.toLowerCase().substring(path.toLowerCase().lastIndexOf(".") + 1);
     83     }
     84 
     85     public static void main(String[] args){
     86 /*
     87         //网络文件
     88         String path = "https://resource.puxinwangxiao.com/gaozhongbibeiwenyanwengushici_5.mp3" ;
     89         long result = 0;
     90         try {
     91             String tmppath = getFileByUrl(path);
     92             result = getDuration(tmppath);
     93         } catch (IOException e) {
     94             e.printStackTrace();
     95         }
     96         System.out.println(result);
     97 */
     98 
     99 
    100         //本地文件
    101         String path = "/Users/liuwen/Downloads/temp/语音测试文件/xiaoshizi.wav" ;
    102         long result = 0;
    103         try {
    104             result = getDuration(path);
    105         } catch (IOException e) {
    106             e.printStackTrace();
    107         }
    108         System.out.println(result);
    109 
    110     }
    111     public static String getFileByUrl(String url) throws UnknownHostException, IOException{
    112         File tmpFile = File.createTempFile("temp", url.substring(url.lastIndexOf(".")));//创建临时文件
    113         Image2Binary.toBDFile(url, tmpFile.getCanonicalPath());
    114         return tmpFile.getCanonicalPath();
    115     }
    116 
    117 }
      1 package com.puxinwangxiao.mts.util;
      2 
      3 
      4 import org.jaudiotagger.audio.AudioFileIO;
      5 import org.jaudiotagger.audio.mp3.MP3AudioHeader;
      6 import org.jaudiotagger.audio.mp3.MP3File;
      7 
      8 
      9 import javax.sound.sampled.AudioFormat;
     10 import javax.sound.sampled.AudioInputStream;
     11 import javax.sound.sampled.AudioSystem;
     12 import java.io.File;
     13 
     14 public class AudioUtil {
     15 
     16 
     17     /**
     18      * 获取语音文件播放时长(秒) 支持wav 格式
     19      * @param filePath
     20      * @return
     21      */
     22     public static Float getDuration(String filePath){
     23         try{
     24 
     25             File destFile = new File(filePath);
     26             AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(destFile);
     27             AudioFormat format = audioInputStream.getFormat();
     28             long audioFileLength = destFile.length();
     29             int frameSize = format.getFrameSize();
     30             float frameRate = format.getFrameRate();
     31             float durationInSeconds = (audioFileLength / (frameSize * frameRate));
     32             return durationInSeconds;
     33 
     34         }catch (Exception e){
     35             e.printStackTrace();
     36             return 0f;
     37         }
     38 
     39     }
     40 
     41     /**
     42      * 获取mp3语音文件播放时长(秒) mp3
     43      * @param filePath
     44      * @return
     45      */
     46     public static Float getMp3Duration(String filePath){
     47 
     48         try {
     49             File mp3File = new File(filePath);
     50             MP3File f = (MP3File) AudioFileIO.read(mp3File);
     51             MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
     52             return Float.parseFloat(audioHeader.getTrackLength()+"");
     53         } catch(Exception e) {
     54             e.printStackTrace();
     55             return 0f;
     56         }
     57     }
     58 
     59 
     60     /**
     61      * 获取mp3语音文件播放时长(秒)
     62      * @param mp3File
     63      * @return
     64      */
     65     public static Float getMp3Duration(File mp3File){
     66 
     67         try {
     68             //File mp3File = new File(filePath);
     69             MP3File f = (MP3File) AudioFileIO.read(mp3File);
     70             MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
     71             return Float.parseFloat(audioHeader.getTrackLength()+"");
     72         } catch(Exception e) {
     73             e.printStackTrace();
     74             return 0f;
     75         }
     76     }
     77 
     78 
     79     /**
     80      * 得到pcm文件的毫秒数
     81      *
     82      * pcm文件音频时长计算
     83      * 同图像bmp文件一样,pcm文件保存的是未压缩的音频信息。 16bits 编码是指,每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。 16000采样率 是指 1秒钟采样 16000次。常见的音频是44100HZ,即一秒采样44100次。 单声道: 只有一个声道。
     84      *
     85      * 根据这些信息,我们可以计算: 1秒的16000采样率音频文件大小是 2*16000 = 32000字节 ,约为32K 1秒的8000采样率音频文件大小是 2*8000 = 16000字节 ,约为 16K
     86      *
     87      * 如果已知录音时长,可以根据文件的大小计算采样率是否正常。
     88      * @param filePath
     89      * @return
     90      */
     91     public static long getPCMDurationMilliSecond(String filePath) {
     92         File file = new File(filePath);
     93 
     94         //得到多少秒
     95         long second = file.length() / 32000 ;
     96 
     97         long milliSecond = Math.round((file.length() % 32000)   / 32000.0  * 1000 ) ;
     98 
     99         return second * 1000 + milliSecond;
    100     }
    101 
    102 
    103 
    104 
    105 }
     1 package com.puxinwangxiao.mts.util;
     2 
     3 import java.io.ByteArrayOutputStream;
     4 import java.io.DataInputStream;
     5 import java.io.FileOutputStream;
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 import java.net.HttpURLConnection;
     9 import java.net.MalformedURLException;
    10 import java.net.URL;
    11 import java.net.UnknownHostException;
    12 
    13 import org.slf4j.Logger;
    14 import org.slf4j.LoggerFactory;
    15 
    16 /**
    17  * 文件处理
    18  */
    19 public class Image2Binary
    20 {
    21     private static Logger log = LoggerFactory.getLogger(Image2Binary.class);
    22 
    23     public static byte[] toByteArray(InputStream in) throws IOException {
    24 
    25         ByteArrayOutputStream out=new ByteArrayOutputStream();
    26         byte[] buffer=new byte[1024*4];
    27         int n=0;
    28         while ( (n=in.read(buffer)) !=-1) {
    29             out.write(buffer,0,n);
    30         }
    31         return out.toByteArray();
    32     }
    33 
    34 
    35     /**
    36      * @throws IOException
    37      * @throws MalformedURLException
    38      * 网络文件转换为本地文件
    39      * @Title: toByteArray
    40      * @param @param url
    41      * @param @return
    42      * @param @throws IOException    设定文件
    43      * @return byte[]    返回类型
    44      * @throws
    45      */
    46     public static void toBDFile(String urlStr, String bdUrl) throws IOException,UnknownHostException{
    47         URL url = new URL(urlStr);
    48         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    49         DataInputStream in = new DataInputStream(conn.getInputStream());
    50         byte[] data=toByteArray(in);
    51         in.close();
    52         FileOutputStream out=new FileOutputStream(bdUrl);
    53         out.write(data);
    54         out.close();
    55     }
    56 
    57 
    58 
    59 }
  • 相关阅读:
    DevExpress 数据与展示的不同
    WPF 自定义属性
    ruby中的retry和redo
    linux mint 18.1 安装nvidia显卡驱动
    gradle << 操作符作废
    emacs不能使用中文输入法
    linux mint 崩溃
    mint安装相关数据库lib
    字体安装文泉驿正黑
    Emacs使用projectile-rails 插件注意事项
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12991612.html
Copyright © 2020-2023  润新知