android MediaPlaye.getDuration()获取不到在线音乐时长,看看mediaPlayer.getDuration()的源码,里面明确地说了,不支持在线内容,所以,根本原因就是它(不过我本地资源也获取不到)
/**
* Gets the duration of the file.
*
* @return the duration in milliseconds, if no duration is available
* (for example, if streaming live content), -1 is returned.
*/
public native int getDuration();
解决办法:使用MediaMetadataRetriever获取音视频总时长。
try {
//1,创建MediaMetadataRetriever对象
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
//2.设置音视频资源路径
retriever.setDataSource(path);
//3.获取音视频资源总时长
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
}catch (Exception e){
e.printStackTrace();
}
遇到的问题:
报错:java.lang.RuntimeException: setDataSource failed: status = 0x80000000
解决办法:
1.加网络权限
<uses-permission android:name="android.permission.INTERNET" />
2.替换下setDataSource的参数形式
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(new File(currentAudioPath).getAbsolutePath());
retriever.setDataSource(inputStream.getFD());
} catch (Exception e) {
e.printStackTrace();
}
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
3.场景:使用MediaRecorder录制短视频,结束录后,马上通过path获取短视频的时长。这样也会导致报错;
原因:在MediaRecorder.release() 之前调用了获取时长的方法。
解释:MediaRecorder.release()没有调用前,视频文件还属于不完整状态。
解决方案:在MediaRecorder.release()结束后在调用获取时长的方法。
但是,通过这种方法获取的duration可能不准确,对于VBR格式的mp3,duration可能远远比真实的长度小。对于这个问题,可以用比特率和文件大小来计算:
下面是我采用的方式
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
long fileSize = new File(currentAudioPath).length();
retriever.setDataSource(new File(currentAudioPath).getAbsolutePath());
long bitRate = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE));
long duration = (fileSize*8) /(bitRate);//单位秒
retriever.release();//务必release