2011-11-07 34 views
9

Cách nhận thời lượng bản nhạc mp3 mà không cần tạo phiên bản MediaPlayer? Tôi chỉ cần để hiển thị bài hát mp3 dài trong danh sách tập tin mp3, vì vậy tôi nghĩ rằng tôi không nên tạo ra đối tượng MediaPlayer cho mỗi bài hát trong danh sáchNhận thời lượng mp3 trong android

Và khác:

đôi khi MediaPlayer trả về thời gian sai của bài hát (Tôi nghĩ rằng nó vì vậy bởi vì bitrate của những tập tin là dinamic). Làm thế nào tôi có thể nhận được đúng thời lượng của bài hát?

Trả lời

6

Bạn có thể sử dụng MediaMetadataRetriever để nhận thời lượng bài hát. Sử dụng số METADATA_KEY_DURATION kết hợp với số extractMetadata() funciton.

+0

này Cảm ơn bạn rất nhiều, lớp này là rất hữu ích, nhưng làm việc của mình từ cấp api 10, android 2.3.3 và cao hơn. Tôi cần giải pháp phổ quát hơn ( – pleerock

+0

Hmmm, xin lỗi. Tôi không biết cách nào khác. –

+0

Điều này không hữu ích lắm vì hầu hết mọi người vẫn có Eclair hoặc Froyo. Có thể trong một vài năm .. – miq

1

Nếu bạn muốn hỗ trợ các phiên bản Android cũ hơn, bạn có thể sử dụng thư viện của bên thứ ba. Ví dụ http://www.jthink.net/jaudiotagger/ hoạt động tốt, mặc dù nó tương đối không gian tiêu thụ cho một ứng dụng Android (một chút ít hơn 1 MB).

Trình lập trình đúng sẽ phân tích cú pháp thời lượng từ tệp nhị phân mà không cần sử dụng bất kỳ thư viện nào;) Tôi không có đủ kỹ năng cho việc này.

+0

'jaudiotagger' không tương thích với Android. –

+1

jaudiotagger tương thích với Android. Tôi đã thử. – miq

25
 // load data file 
     MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
     metaRetriever.setDataSource(filePath); 

String out = ""; 
     // get mp3 info 

     // convert duration to minute:seconds 
String duration = 
    metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    Log.v("time", duration); 
    long dur = Long.parseLong(duration); 
    String seconds = String.valueOf((dur % 60000)/1000); 

    Log.v("seconds", seconds); 
    String minutes = String.valueOf(dur/60000); 
    out = minutes + ":" + seconds; 
    if (seconds.length() == 1) { 
     txtTime.setText("0" + minutes + ":0" + seconds); 
    }else { 
     txtTime.setText("0" + minutes + ":" + seconds); 
    } 
    Log.v("minutes", minutes); 
     // close object 
     metaRetriever.release(); 
+0

awesome! thanks :) Tôi phải thừa nhận rằng tôi rất ngạc nhiên khi có quá nhiều mã ... –

+0

Nó không mất nhiều mã, khá nhiều thứ sau khi anh gọi tới extractMetaData không liên quan đến câu hỏi. – IcedDante

0

tôi tìm thấy chính xác hơn getLength with FFmpeg

int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath); 
Các vấn đề liên quan