最近的一个项目需要按照时间播放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左右,用哪一种,见仁见智了。