首页 > 编程语言 >Java获取音频文件(MP3)的播放时长

Java获取音频文件(MP3)的播放时长

时间:2023-01-04 16:00:40浏览次数:47  
标签:Java String 音频文件 printStackTrace MP3 catch new 播放 mp3

最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐。

这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件。

方案一:Java的方式

找第三方的库,真的感谢这些提供jar包的高手,找到一个项目:jaudiotagger。

复制代码
 1         try {
 2             
 3             MP3File file = new MP3File("E:\\music\\光辉岁月.mp3");            
 4             MP3AudioHeader audioHeader = (MP3AudioHeader)file.getAudioHeader();
 5             
 6             String strLen = audioHeader.getTrackLengthAsString();
 7             System.out.println(strLen);
 8             
 9             int intLen = audioHeader.getTrackLength();
10             System.out.println(intLen);
11             
12         } catch (IOException e) {
13             e.printStackTrace();
14         } catch (TagException e) {
15             e.printStackTrace();
16         } catch (ReadOnlyFileException e) {
17             e.printStackTrace();
18         } catch (InvalidAudioFrameException e) {
19             e.printStackTrace();
20         } catch (CannotReadException e) {
21             e.printStackTrace();
22         }
复制代码

上面的示例代码输出的结果如下:

1 04:01
2 241

很强大,上面显示04分钟,01秒。即下面的4*60+1=241秒。

这种方案简单测试了一下时间,每次计算需要120ms左右,略长。

方案二:自己动手计算。

复制代码
 1 步骤一 计算文件长度
 2 File file = new File("/home/monitor/broadsound/as.mp3");
 3          long length = file.length();
 4 步骤二 查询文件的播放速度(Linux下)
 5 String rate = "";
 6          try {
 7                 String[] command = { "/bin/sh", "-c", "file /home/monitor/broadsound/as.mp3" };
 8                 Process process = Runtime.getRuntime().exec(command);
 9                 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
10                 StringBuffer buff = new StringBuffer();
11                 String line;
12                 if ((line = br.readLine()) != null) {
13                     System.out.println(line);
14                     buff.append(line).append("\n");
15                     String tt  = line.split(",")[4];
16                     rate = tt.split(" ")[1].trim();
17                     System.out.println(rate);
18                 }
19             } catch (Exception e) {
20                 e.printStackTrace();
21             }
22 步骤三 除法运算
23 wantedTime = length / 1000 * 8 / Integer.parseInt(rate)
复制代码

这个数据算出来不是特别准确,但是花费时间20ms左右,用哪一种,见仁见智了。

标签:Java,String,音频文件,printStackTrace,MP3,catch,new,播放,mp3
From: https://www.cnblogs.com/kn-zheng/p/17025106.html

相关文章

  • 又见JavaWeb的中文乱码
    简单翻了一下记录,我已经写了至少4篇关于编码和乱码的博客了,每次都觉得自己懂了。实际上,这次的遭遇证明了“真懂”是一种很难达到的境界,吾辈仍需努力!一、背景是这样子的:......
  • Java 中文字符串编码之GBK转UTF-8
    写过两篇关于编码的文章了,以为自己比较了解编码了呢?!结果今天又结结实实的上了一课。以前转来转去解决的问题终归还是简单的情形。即iso-8859-1转utf-8,或者iso-8859-1转gb......
  • Linux删除多个java进程的其中一个
    一、背景:Linux后台运行了多个Java程序,进程名都是java。执行pkilljava会一次性杀掉所有的java进程。二、解决思路:1先通过一定的检索条件,定位出指定的java进程23......
  • java LinkedHashMap学习
    一、LinkedHashMap概述LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。LinkedHashMap是Map接口的哈希表......
  • freeswitch编译java esl
    一、背景假设源代码路径为/home/freeswitch二、编译安装libesl.a1.cd/home/freeswitch(源代码的根目录)执行./configure,以便生成必要的Makefile文件。2.cd/home/fre......
  • Java程序(非web)slf4j整合Log4j2
    一、依赖包准备//slf4j项目提供compilegroup:'org.slf4j',name:'slf4j-api',version:'1.7.25'//log4j2项目提供compilegroup:'org.apache.logging.log4j',na......
  • JAVA命令行编译及运行
    第一部分:单文件一、背景目标文件HelloWorld.javapackageccdate;publicclassHelloWorld{publicstaticvoidmain(String[]args){......
  • sun.security.validator.ValidatorException: PKIXpath building failed: sun.securit
    报错信息:javax.net.ssT.SSLHandshakeExceptions.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtoreguestedtarget问题描述:在ja......
  • Java调用Linux命令(cd的处理)
    一、Java调用Linux系统的命令非常简单这是一个非常常用的调用方法示例:1publicStringexecuteLinuxCmd(Stringcmd){2System.out.println("gotcmd......
  • [java] a simple Applet program
    //javacodefileimportjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.net.*;publicclassWelcomeAppletextendsJApplet{publicvoidinit()......