getDuration的媒体播放器错误(1,-107)

时间:2013-10-28 00:02:42

标签: android android-mediaplayer

在我的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)

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

2 个答案:

答案 0 :(得分:1)

已编辑的回复:

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

P.S:你可以试试基于file的输入吗?

OLD回复:

错误prepareAsync called in state 8表示MediaPlayer处于PREPARED状态,因此,在此状态下调用prepareAsync是错误的。我觉得您的问题可能是由于reset被调用作为实施的一部分。请参阅此link here,它解释了新创建和重置播放器之间的差异,尤其是状态图下方的段落。

我建议你修改你的获取实例实现以包含release并删除重置如下。我觉得这可以解决你的问题。

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;
}

答案 1 :(得分:0)

您期望异步操作的同步输出。在getPodDuration方法返回时,准备好的回调将不会发生,因此duration将是它进入方法之前的任何内容。

此外,您只需要设置一次准备好的侦听器。将其设置在您创建MediaPlayer的相同位置。就个人而言,在这种情况下,我不是单身模式的粉丝,但它应该仍然有效。您的duration成员需要与MediaPlayer一起保持静态。