java 读取音频/视频 文件时长-亲测MP3有效

原文:https://blog.csdn.net/thinktothings/article/details/88856285

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

源码

https://github.com/opensourceteams/java-maven-project
一、依赖导入

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>

二、工具类

1.获取视频文件

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


}


2.获取音频文件


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






}

三、测试案例

@Test
void  select() throws IOException {
System.out.println(AudioUtil.getMp3Duration("C:\\Users\\yjtzf\\Desktop\\83511610536637795.mp3"));
    
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java本身不提供对视频音频的处理功能,但可以使用第三方库来实现去除视频文件中的声音。常用的库是Xuggler和JAVE(Java Audio Video Encoder),它们都支持通过Java代码调用FFmpeg。以下是使用Xuggler的示例代码: ```java import com.xuggle.mediatool.IMediaReader; import com.xuggle.mediatool.IMediaWriter; import com.xuggle.mediatool.ToolFactory; import com.xuggle.xuggler.ICodec; public class RemoveAudioFromVideo { public static void main(String[] args) { String inputFilePath = "input.mp4"; String outputFilePath = "output.mp4"; IMediaReader mediaReader = ToolFactory.makeReader(inputFilePath); IMediaWriter mediaWriter = ToolFactory.makeWriter(outputFilePath, mediaReader); mediaReader.addListener(mediaWriter); mediaWriter.setForceInterleave(true); mediaWriter.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, mediaReader.getContainer().getStream(0).getFrameRate().getDouble()); mediaWriter.addAudioStream(1, 0, 0, 0, 0); while (mediaReader.readPacket() == null) ; } } ``` 这段代码使用Xuggler读取输入文件,并将视频流写入到输出文件中,同时添加一个空音频流,从而达到去除视频文件中声音的目的。需要注意的是,Xuggler已经停止维护,如果需要更高级的功能,建议使用FFmpeg的Java接口或其他第三方库。 ### 回答2: Java本身没有提供直接去除视频文件中声音的功能,需要借助外部库或工具来实现此功能。FFmpeg是一个功能强大的音视频处理工具,可以用于处理和编辑音视频文件,包括去除视频中的声音。然而,Java并不直接集成FFmpeg,因此无法直接使用FFmpeg去除视频文件中的声音。 要使用Java去除视频文件中的声音,可以借助其他的Java库或框架来实现。一种方法是使用JavaCV库,它是一个基于Java的OpenCV和FFmpeg的接口库,可以让Java程序调用FFmpeg的功能。在使用JavaCV时,你可以调用FFmpeg的命令行参数来去除视频文件中的声音。 另一种方法是使用Java自带的音视频处理库,如javax.sound.sampled库来处理音频,然后使用Java图形库如JavaFX来处理视频。可以使用这些库读取原始的视频文件音频文件,然后分离音频轨道和视频轨道,再将分离出的视频轨道合成成一个新的视频文件,从而达到去除视频文件中声音的效果。 总结来说,Java本身没有直接提供去除视频文件中声音的功能,但可以借助其他的Java库或工具来实现此功能,如JavaCV库或javax.sound.sampled库等。 ### 回答3: 在Java中,不使用FFmpeg去除视频文件中的声音是有一定的难度的。因为Java自带的库并没有提供直接处理视频文件的功能。但是,仍然可以通过其他方式来实现去除视频文件中声音的功能。 一种方法是使用Java提供的ProcessBuilder类来执行命令行操作。可以使用该类执行FFmpeg的命令行命令,通过命令行参数来实现去除视频文件中声音的功能。比如可以调用FFmpeg的命令行工具,使用“-an”参数来指定不提取音频流。这样执行命令后,会生成一个没有声音的新视频文件。 另一种方法是使用第三方Java库来处理视频文件。虽然Java本身没有支持直接处理视频文件的功能,但是有一些第三方Java库可以实现视频处理的功能,并可以实现去除声音的操作。例如,可以使用Xuggler库或者JavaCV库来处理视频文件。这些库提供了对FFmpeg的封装,可以在Java中调用FFmpeg的功能,包括去除视频文件中的声音。 无论使用哪种方法,都需要先确保系统中已经安装了FFmpeg,并正确设置了环境变量。然后,在Java代码中调用相应的命令行或者第三方库的函数,传入视频文件路径和相应的参数,即可实现去除视频文件中声音的功能。 需要注意的是,由于FFmpeg是一个强大的多媒体处理工具,其命令行参数众多,使用起来可能需要一定的学习和理解成本。同时,对于大文件或者复杂的视频文件,去除声音可能会消耗较长的时间和系统资源。因此,在实际应用中,需要根据具体情况选择最合适的方法来去除视频文件中的声音。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值