Странное поведение с mediaplayer и seekTo

Я реализую пользовательский видеоплеер, потому что мне нужны пользовательские управления видео. У меня есть приложение только с одним действием, которое на запуске должно начать играть видео сразу же.

Теперь, проблема, которую я имею:

Я не хочу, чтобы видео запустилось с начала, но от более позднего положения. Поэтому я делаю seekTo (16867). Так как seekTo является асинхронным, я помещаю вызов запуска mediaplayer (player.start ()) в onSeekComplete onSeekCompleteListener.

Странное поведение, которое я испытываю, хотя то, что я могу видеть/слышать, что видео играет с начала для нескольких millisecs, прежде чем оно на самом деле подыграет от/переходы положению, к которому я ослепил. Но - с другой стороны - вывод Журнала я звоню, прежде чем player.start возвращает правильное положение 16867, где я ослепил к.

Ниже раздел соответствующих норм, полный класс по http://pastebin.com/jqAAFsuX

(Я нахожусь на Nexus One / 2.2 StageFright),

private void playVideo(String url) {
    try {
        btnVideoPause.setEnabled(false);
        if (player==null) {
            player=new MediaPlayer();
            player.setScreenOnWhilePlaying(true);
        }
        else {
            player.stop();
            player.reset();
        }
        url = "/sdcard/myapp/main/videos/main.mp4";  // <--- just for test purposes hardcoded here now     
        player.setDataSource(url);
        player.setDisplay(holder);
        player.setAudioStreamType(AudioManager.STREAM_MUSIC);
        player.setOnCompletionListener(this);
        player.setOnPreparedListener(this);

        player.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
            public void onSeekComplete(MediaPlayer mediaPlayer) {
                    Log.d("APP", "current pos... "+ player.getCurrentPosition() );
                    player.start();          // <------------------ start video on seek completed
                    player.setOnSeekCompleteListener(null);
                }
        });            
        player.prepareAsync();
    }
    catch (Throwable t) {
        Log.e(TAG, "Exception in btnVideoPause prep", t);
    }
}

public void onPrepared(MediaPlayer mediaplayer) {
    width=player.getVideoWidth();
    height=player.getVideoHeight();
    if (width!=0 && height!=0) {
        holder.setFixedSize(width, height);
        progressBar.setProgress(0);
        progressBar.setMax(player.getDuration());
        player.seekTo(16867);                   // <------------------ seeking to position
    }   
    btnVideoPause.setEnabled(true);
}

5
задан Mathias Conradt 16 June 2010 в 04:27
поделиться

1 ответ

Поскольку я также не получил никакого ответа из списка разработчиков Android и нашел похожие проблемы в Интернете, я заключил, что это ошибка. Я отправил сообщение об ошибке по адресу http://code.google.com/p/android/issues/detail?id=9135

4
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: