2013-06-21 10 views
5

Trochę się wprawszy, ale nie mogłem znaleźć rozwiązania tego problemu: Chciałbym zagrać w MediaPlayer i wstrzymać/zatrzymać go w danym momencie .. (tj. : grać od drugiej 6 do drugiej 17).Pauza/Stop MediaPlayer Android w zadanym czasie programowo

Wiem, że mogę ustawić jego punkt początkowy metodą seekTo(), ale czy mogę zatrzymać/zatrzymać odtwarzanie, ustawiając punkt końcowy (oczywiście przed osiągnięciem limitu końca pliku)?

Odpowiedz

14

Istnieją różne sposoby, można to zrobić, tutaj jest jeden:

int startFrom = 6000; 
int endAt = 11000; 

MediaPlayer mp; 

Runnable stopPlayerTask = new Runnable(){ 
    @Override 
    public void run() { 
     mp.pause(); 
    }}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    mp = MediaPlayer.create(this, R.raw.my_sound_file); 
    mp.seekTo(startFrom); 
    mp.start(); 

    Handler handler = new Handler(); 
    handler.postDelayed(stopPlayerTask, endAt); 
} 

MediaPlayer rozpocznie odtwarzanie 6 sekund i wstrzymać mu 11 sekund po tym (w drugim 17).

+0

Dzięki, twoja odpowiedź wygląda dokładnie tak, jak tego szukałam. – DoruAdryan

+0

Dlaczego użyłeś 'mp.pause();' zamiast 'mp.stop();'? –

+0

@SomeoneSomewhere raz zatrzymany nie można go uruchomić ponownie bez wywoływania 'przygotować()'. Wolę wstrzymywać się, jeśli jest szansa, że ​​chcę zagrać jeszcze raz. Wywołanie 'stop()' jest bardziej ostateczne. –

1

Można użyć CountDownTimer

new CountDownTimer(30000, 1000) { 

    public void onTick(long millisUntilFinished) { 

    } 

    public void onFinish() { 
     mp.stop; 
     mp.relese(); 
    } 
    }.start(); 
3

myślę, że można tworzyć Timer i nazywają seekTo() bezpośrednio ze swojego zadania. Następnie wywołaj funkcję stop()/pause() wewnątrz zadania Timera.

Może być pomocna dla ciebie this post.

Albo możesz użyć programu do obsługi tego zadania, jak pokazuje to Ken Wolf.

Najlepsze życzenia.

+0

Dzięki, jest to również niezły answe, ale wolę handler, ponieważ poradziłbym sobie z łatwiejszymi przypadkami, takimi jak: użytkownik wstrzymujący/zatrzymujący gracza przez niego samego lub zmuszony do zatrzymania odtwarzacza, gdy aktywność zostanie zatrzymana. (przerwanie wątku po wywołaniu snu() jest trochę denerwujące :)) – DoruAdryan

0

Wiem, że już ma odpowiedź, ale tutaj jest alternatywa dla każdego, kto chce to zrobić skutecznie na wideo z kontroli.

Widziałem inną odpowiedź, która wymagała stałego sprawdzania pozycji.

Należy pamiętać, że zakłada się, że nie potrzeba wielu różnych części jednego filmu. Nawet w tym przypadku sugeruję, aby postępować zgodnie z poniższym.

Jeśli potrzebujesz tylko odtworzyć fragment filmu i chcesz go gdzieś zakończyć, to dlaczego nie skorzystać z bezpłatnego oprogramowania do edycji wideo i nagrać koniec? Nadal możesz uruchomić go z dowolnego miejsca, używając seekTo(), ale w ten sposób nie musisz marnować zasobów na sprawdzanie określonej pozycji (wideo z kontrolkami).

Jeśli nie masz kontrolek odtwarzacza wideo, zaakceptowana odpowiedź zadziała. Ale jeśli masz kontrolki odtwarzacza, to nie, ponieważ użytkownik może zatrzymać i odtworzyć wideo.

0

Istnieje różnica czasu między wideoView.start() i wideo przygotowane do gry zależy od formatu wideo, różnica czasu jest prawdopodobnie większa niż 10 klatek.

Najlepszym sposobem na zrobienie tego jest uruchomienie timera w OnPreparedListener w celu zminimalizowania różnicy czasu, a nawet więcej, aby uzyskać aktualny czas trwania gry i ustawić w tym miejscu zegar postDelayed.

Powiązane problemy