zoukankan      html  css  js  c++  java
  • Java获取音频文件(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("
    ");
    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左右,用哪一种,见仁见智了。

    
    
  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 10. Define a Function to Set Common Behaviors in Operators
    [Java Spring] Aspect
    [Javascript] Broadcaster + Operator + Listener pattern -- 24. Design choice, ifElse or merge
    [Javascript] Broadcaster + Operator + Listener pattern -- 23. ifElse operator
    [Git] Revert to a old commit
    [Tools] Dendron
    [Java Spring] Spring Expression Language
    [Java Spring] @Profile
    [Java Spring] @Value & override properties by environment variables
    [Java Spring] Implementing Spring Security
  • 原文地址:https://www.cnblogs.com/yoyotl/p/5614530.html
Copyright © 2011-2022 走看看