Mediaplayer.seekTo Methode springt an falsche Position

  • Antworten:0
Dennis
  • Forum-Beiträge: 1

29.05.2012, 18:15:51 via Website

Hallo zusammen,

Ich habe folgendes Problem:

Ich habe eine Test-Audiodatei, welche immer denselben Sound in einem 10 Sekunden loop abspielt, um zu testen, ob die Methode Mediaplayer.seekTo korrekt arbeitet.
Es hat sich herausgestellt, dass nicht genau zu der Position gesprungen wird, die als Parameter übergeben wurde, sondern diese teilweise um einige Sekunden verfehlt.

Ich habe dies mit verschiedenen Formaten (mp3 (cbr), wav bei 44.1KHz), api levels (2.1, 2.2) und Geräten (Milestone, Galaxy S WiFI) getestet, immer mit demselben Ergebnis.
Anzumerken sei noch, dass sich dieser Fehler besonders bei größeren Dateien (mp3: 50mb, wav: 200mb) bemerkbar macht, diese Größe aber jedoch notwendig ist.

Hat einer von euch eine Idee, woran dies genau liegen könnte bzw. beheben kann, oder welche Faktoren noch nicht beachtet wurden?

Hier der Test-Code:

1public class Audioplayer extends Activity implements OnPreparedListener, OnSeekCompleteListener {
2
3 public MediaPlayer player;
4
5 public long lastTime;
6
7 public int interval = 1000 * 10;
8 public int next = 0;
9
10 public Timer t;
11
12 /** Called when the activity is first created. */
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17 player = new MediaPlayer();
18 try {
19 player.setDataSource(android.os.Environment.getExternalStorageDirectory() + "/track.mp3");
20 player.prepareAsync();
21 } catch (IllegalArgumentException e1) {
22 e1.printStackTrace();
23 } catch (IllegalStateException e1) {
24 e1.printStackTrace();
25 } catch (IOException e1) {
26 e1.printStackTrace();
27 }
28
29 player.setOnPreparedListener(this);
30 player.setOnSeekCompleteListener(this);
31 }
32
33 private void setTimer() {
34 long time = Calendar.getInstance().getTimeInMillis();
35 lastTime = time;
36
37 t = new Timer();
38 t.scheduleAtFixedRate(new TimerTask() {
39
40 @Override
41 public void run(){
42 next+=20000;
43 Log.i("igplayer", "seek: position: " + player.getCurrentPosition() + " - next: " + next);
44 player.seekTo(next);
45
46 }}, 3000, 10000);
47 }
48
49 @Override
50 public void onPrepared(MediaPlayer arg0) {
51 setTimer();
52 }
53
54 @Override
55 public void onSeekComplete(MediaPlayer mp) {
56 Log.i("igplayer", "onseekcomplete: " + player.getCurrentPosition());
57 player.start();
58
59 LinearLayout l = (LinearLayout) findViewById(R.id.layout);
60 l.setBackgroundColor(Color.WHITE);
61
62 new Handler().postDelayed(new Runnable() {
63
64 @Override
65 public void run() {
66 Log.i("igplayer", "pause: " + player.getCurrentPosition());
67 LinearLayout l = (LinearLayout) findViewById(R.id.layout);
68 l.setBackgroundColor(Color.BLACK);
69 player.pause();
70
71 }
72 }, 6000);
73
74 }

Antworten