1

在我的中listView,我正在显示来自 API 的一些媒体内容。该 API 不包含有关媒体持续时间的任何信息,所以我想我会创建一个辅助类来处理这个问题。

public static String getPodDuration(String url){
    utils = new Utilities();
    try{
    mep = getInstance();
    mep.reset();
    mep.setDataSource(url);
    mep.prepareAsync();
    mep.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub
            duration = mep.getDuration();
            Log.i("duration", String.valueOf(duration));
        }
    });
    } catch(IllegalArgumentException e){

    } catch(IllegalStateException e){

    } catch(IOException e){

    }
    return String.valueOf(utils.milliSecondsToTimer(duration));
}

getInstance()如下:

static MediaPlayer mep = null;
public static MediaPlayer getInstance(){
    if(mep == null){
        mep = new MediaPlayer();
    }
    return mep;
}

因此,在这些方法的帮助下,我在主类中传递了媒体文件的 URL。但由于某种原因,它只给了我 0:00 的价值。utils.milliSecondsToTimer(duration)方法虽然工作正常。

我收到以下错误:

error (1, -107)

有人可以帮助实现这个吗?我不必播放这个媒体,我只需要得到它的持续时间。

4

2 回答 2

1

编辑回复:

错误error (1, -107)来自播放器引擎NuPlayer,即播放器尝试连接到URL. 错误代码-107对应于ENOTCONN(参考:)errno。请检查URL您提供给播放器的连接。

PS:您可以尝试file基于输入吗?

旧回应:

该错误prepareAsync called in state 8表明aMediaPlayer处于PREPARED状态,因此prepareAsync在此状态下调用 a 是错误的。我觉得您的问题可能是由于reset作为实现的一部分被调用。请参阅此处的此链接,该链接解释了新创建的播放器和重置播放器之间的区别,尤其是状态图下方的段落。

我建议您修改您的 get 实例实现以包含 arelease并删除重置,如下所示。我觉得这应该可以解决您的问题。

public static String getPodDuration(String url){
utils = new Utilities();
try{
    mp = getInstance();
    mp.setDataSource(url);
    mp.prepareAsync();
    ........

static MediaPlayer mp = null;
public static MediaPlayer getInstance(){
    if(mp != null){
        mp.release();
    }
    mp = new MediaPlayer();
    return mp;
}
于 2013-10-28T00:47:31.350 回答
0

您期望来自异步操作的同步输出。getPodDuration准备好的回调在方法返回时不会发生,所以duration无论它进入方法之前是什么。

此外,您只需要设置一次准备好的侦听器。将其设置在您创建MediaPlayer. 就个人而言,在这种情况下,我不喜欢单例模式,但它应该仍然有效。您的duration成员需要与MediaPlayer.

于 2013-10-28T05:26:09.647 回答