【问题标题】:Android SDK MediaPlayer doesn't seek correctlyAndroid SDK MediaPlayer 无法正确搜索
【发布时间】:2016-05-07 13:42:27
【问题描述】:

我有一个 mp3 文件,我的应用程序必须寻找该 mp3 文件的某个选定时间,然后从那里开始播放。

我通过这种方法将我的字符串时间转换为int值

private static int convert(String time) {
    int quoteInd = time.indexOf(":");
    int pointInd = time.indexOf(".");

    int min = Integer.valueOf(time.substring(0, quoteInd));
    int sec = Integer.valueOf(time.substring(++quoteInd, pointInd));
    int mil = Integer.valueOf(time.substring(++pointInd, time.length()));

    return (((min * 60) + sec) * 1000) + mil;
} 

注意:我的刺痛是这样的 5:12.201 表示 5 分 12 秒和 201 毫秒。

我从MP3 Audio Editor 应用程序(适用于 Windows)获得这些时间,并使用KMPlayer 应用程序(适用于 Windows)检查主题。这些时间对他们俩都是正确的。

但在我的应用程序中,当我寻找我的MediaPlayer 时,音频不会从我选择的位置开始。(时间正确但声音不同。)


我认为MediaPlayer 没有正确地寻找那个时间。所以我在玩之前通过调用getCurrentPosition()来检查当前位置,但是返回值和搜索值是一样的。

我对此一无所知。


编辑:

我的问题不是时间转换。

我正确地转换并寻找到那里,但它播放了当时没有预料到的东西。

这意味着KMPlayer和Android中的时间是不同的。

我的问题是方法?如何解决?

【问题讨论】:

  • 这是 CBR 还是 VBR MP3 文件(恒定或可变比特率)?
  • 如果您需要帮助以获得有效答案,您必须回复建议。如果您在播放后检查当前位置会发生什么?逻辑是检查它从现在开始播放的时间,甚至在开始播放之前不要关心检查的最后位置。 System.out.printlngetCurrentPosition(); 的价值有何看法?如果您想寻找 5 分钟 12 秒和 201 毫秒,则应该是 312201...此外,如果从互联网加载,请确保在寻找该时间之前 5 分钟可用(缓冲)。
  • PS:我之前测试过你的代码,它给出了正确的搜索值312201。你得到什么数字来寻求更正时间但播放错误的音频部分?偏移量是多少错误的部分,比如它是在实际所需的寻道时间之前/之后播放 30 秒的音频吗?

标签: android audio mp3 android-mediaplayer seektotime


【解决方案1】:

您必须使用 seekTo 方法进行搜索。这需要 毫秒 作为时间偏移量。您的偏移量是您想要播放的距离开始多远,例如距离开始 1 分钟可以是您的偏移量。

注意:我的字符串是这样的 5:12.201 (Mins : Secs : Millisecs)

如果您想寻找像5:12.201 这样的时间,请使用seekTo(312201);

解释

1000毫秒给你一秒,所以12000是12秒,60000 是一分钟。

如果您想要5m:12s 时间,请执行以下操作:

MyMins = 1000 * 60 * 5; //# 5 mins at 60 secs per minute
MySecs = 1000 * 12; //# 12 secs
MyMilliSecs = 201; //# 201 millisecs
SeekValue = (MyMins + MySecs + MyMilliSecs);
seekTo(SeekValue); //# seeks to 312201 millisecs (is == 5 min & 12 secs & 201 ms)

【讨论】:

  • 您的回答只是我的问题的副本。请在回答前阅读问题。
  • 偏移量有多严重?它是按分钟还是秒或只是毫秒?当您寻找特定的 MP3 时,它会播放比您实际所需的寻找时间提前 30 秒还是落后于您的音频?您的 MP3 是使用可变比特率还是恒定比特率制作的?您的测试 MP3 是 立体声 16 位 44100 hz (44.1 khz) 文件吗?回复,因为这些事情对于有效的答案很重要
【解决方案2】:

我通常使用这个功能。

我觉得对你有帮助。

 public static String milliSecondsToTimer(long milliseconds){
    String finalTimerString = "";
    String secondsString = "";

    int hours = (int)( milliseconds / (1000*60*60));
    int minutes = (int)(milliseconds % (1000*60*60)) / (1000*60);
    int seconds = (int) ((milliseconds % (1000*60*60)) % (1000*60) / 1000);
    if(hours > 0){
        finalTimerString = hours + ":";
    }

    if(seconds < 10){
        secondsString = "0" + seconds;
    }else{
        secondsString = "" + seconds;}

    finalTimerString = finalTimerString + minutes + ":" + secondsString;

    return finalTimerString;
}

祝你好运:)

【讨论】:

  • 我的问题不是时间转换。请完整阅读我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多