最近的一個項目需要按照時間播放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左右,用哪一種,見仁見智了。