【问题标题】:Get mp3 duration in android在android中获取mp3持续时间
【发布时间】:2011-11-07 20:34:20
【问题描述】:

如何在不创建 MediaPlayer 实例的情况下获取 mp3 曲目时长?我只需要在 mp3 文件列表中显示 mp3 歌曲长度,所以我认为我不应该为列表中的每个曲目创建 MediaPlayer 对象

还有一个:

有时 MediaPlayer 会返回错误的歌曲持续时间(我认为是这样,因为这些文件的比特率是动态的)。如何获得正确的歌曲时长?

【问题讨论】:

    标签: android android-mediaplayer java


    【解决方案1】:
           // 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();
    

    【讨论】:

      【解决方案2】:

      您可以使用MediaMetadataRetriever 获取歌曲的时长。将METADATA_KEY_DURATIONextractMetadata() 功能结合使用。

      【讨论】:

      • 非常感谢,这个类非常有帮助,但它的工作原理是 api 级别 10,android 2.3.3 及更高版本。我需要更通用的解决方案(
      • 嗯,对不起。我不知道还有什么办法。
      • 这不是很有用,因为大多数人仍然有 Eclair 或 Froyo。也许几年后..
      • @miq 你有替代解决方案吗?
      【解决方案3】:

      这是 Kotlin 版本:

      var metaRetriever:MediaMetadataRetriever = MediaMetadataRetriever()
      metaRetriever.setDataSource(filePath)
      
      var out:String = ""
      var txtTime:String = ""
      
      var duration:String = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
      
      Log.d("DURATION VALUE", duration)
      
      var dur:Long = duration.toLong()
      var seconds:String = ((dur % 60000)/1000).toString()
      
      Log.d("SECONDS VALUE", seconds)
      
      var minutes:String = (dur / 60000).toString()
      out = minutes + ":" + seconds
      
      if (seconds.length == 1){
          txtTime = "0" + minutes + ":0" + seconds
      }
      else {
          txtTime = "0" + minutes + ":" + seconds
      }
      
      Log.d("MINUTES VALUE", minutes)
      Log.d("FORMATTED TIME", txtTime)
      
      metaRetriever.release()
      

      【讨论】:

        【解决方案4】:

        如果您想支持较旧的 Android 版本,可以使用 3rd 方库。例如,http://www.jthink.net/jaudiotagger/ 工作正常,但对于 Android 应用程序来说它相对占用空间(略小于 1 MB)。

        真正的程序员当然会在不使用任何库的情况下从二进制文件中解析持续时间;)我没有足够的技能。

        【讨论】:

        • jaudiotagger 与 Android 不兼容。
        • @miq 上次我查看源代码时有 Swing 导入
        【解决方案5】:

        我发现这个更准确getLength with FFmpeg

        int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 2020-12-30
          • 1970-01-01
          • 2019-01-27
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多