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

博客讲述了在Android中使用MediaPlayer获取在线音乐时长遇到的问题,由于源码不支持在线内容导致获取失败。推荐使用MediaMetadataRetriever作为替代方案,并提供了详细的解决步骤和代码示例,包括处理网络权限、文件输入流以及MediaRecorder录制后的时长获取。同时,针对VBR格式文件时长不准确问题,提出了通过比特率和文件大小计算时长的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值