微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android MediaPlaye.getDuration()获取音视频时长的方式

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐