2011-12-27 2 views
1

У меня есть экземпляр MediaPlayer, который готовит сетевой поток. Пока я все еще готов, я выделяю другой экземпляр MediaPlayer и пытаюсь установить источник данных в локальный файл. setDataSource блокирует до завершения подготовки первого экземпляра MediaPlayer. Я тестировал только эмулятор. У вас есть идеи, почему это происходит? Насколько мне известно, 2 экземпляра MediaPlayer должны вести себя независимо. Спасибо.Android MediaPlayer setDataSource блокирует пока другой экземпляр MediaPlayer не завершит подготовку

Я создал небольшой тест вне моего приложения. Это код моего OnCreate метода:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button b = (Button)findViewById(R.id.thebutton); 
    b.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      System.out.println("555555555555555"); 
      MediaPlayer pl2 = new MediaPlayer(); 
      System.out.println("6666666666666"); 
      try { 
       pl2.setDataSource("/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3"); 
       System.out.println("777777777777"); 
       pl2.prepareAsync(); 
       System.out.println("888888888888"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 

    System.out.println("111111111111"); 
    MediaPlayer pl1 = new MediaPlayer(); 
    System.out.println("22222222222222"); 
    try { 
     pl1.setDataSource("http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64"); 
     System.out.println("3333333333333"); 
     pl1.prepareAsync(); 
     System.out.println("444444444444"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

И это выход журнала:

12-28 14:59:57.478: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=net.selfip.imiklosik.tests/.MyActivity bnds=[2,155][58,214] }<br/> 
12-28 14:59:57.707: INFO/System.out(342): 111111111111<br/> 
12-28 14:59:57.737: INFO/System.out(342): 22222222222222<br/> 
12-28 14:59:57.747: INFO/StagefrightPlayer(34): setDataSource('http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64')<br/> 
12-28 14:59:57.747: INFO/System.out(342): 3333333333333<br/> 
12-28 14:59:57.787: INFO/System.out(342): 444444444444<br/> 
12-28 14:59:58.048: INFO/ActivityManager(59): Displayed activity net.selfip.imiklosik.tests/.MyActivity: 426 ms (total 426 ms)<br/> 
12-28 15:00:05.338: INFO/System.out(342): 555555555555555<br/> 
**12-28 15:00:05.338**: INFO/System.out(342): 6666666666666<br/> 
**12-28 15:00:18.449**: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3')<br/> 
12-28 15:00:18.449: INFO/System.out(342): 777777777777<br/> 
12-28 15:00:18.449: INFO/System.out(342): 888888888888<br/> 
12-28 15:00:18.467: ERROR/MediaPlayer(342): error (1, -2147483648)<br/> 
12-28 15:00:18.498: ERROR/MediaPlayer(342): Error (1,-2147483648)<br/> 

Первые жирный шрифт временных меток после того как я нажал на кнопку (прямо перед setDataSource вызова на второй игроке объект).
Вторая полужирная метка после завершения метода setDataSource.
Существует разница в 13 секунд, время, когда был запущен метод setDataSource (называемый совершенно другим объектом MediaPlayer, в то время как первый объект MediaPlayer - даже с подготовкойAsync) был заблокирован.
Почему это происходит? Я делаю что-то неправильно ?

ответ

0

prepareAsync() с первым, который получает поток от сети, поскольку с помощью prepare() будет блокироваться ваш поток пользовательского интерфейса, чтобы второй MediaPlayer подождал, пока первый закончит подготовку.

+0

Я отредактировал мой вопрос, см. Выше. –

+0

вы применили мой ответ в своем коде, затем отредактируйте вопрос с другой ошибкой, каждый из них посвятит мой ответ .. почему это !!! – confucius

+0

Я действительно не понимаю, что вы имеете в виду здесь. Какая еще ошибка? Это ошибка, о которой я говорил ранее (блоки setDataSource до окончания первого приготовления). И я не «применил» ваш ответ, потому что в моей программе я уже использовал метод prepareAsync. Это правда, я забыл это сказать. Кроме того, если бы я раньше работал над подготовкой, я не мог бы снова вызвать setDatasource, потому что пользовательский интерфейс был бы заблокирован. Может быть, просто из другого потока, но тогда не было бы блокировки. Пожалуйста, подождите больше. –

0

Я только что нашел, что если я использую другой сетевой URL (http://listen.radionomy.com/radio-mozart), который является потоком mp3, проблема исчезает. setDataSource больше не блокирует. Первоначальный url был потоком aac, который не поддерживается API8 MediaPlayer. Но все же метод setDataSource, вызванный другим MediaPlayer, не должен блокироваться, на мой взгляд. Это ошибка Android? Теперь мне придется обратиться к этой ситуации, когда блоки setDataSource.