Android MediaPlayer setDataSource блокируется, пока другой экземпляр MediaPlayer не закончит подготовку - PullRequest
1 голос
/ 28 декабря 2011

У меня есть экземпляр MediaPlayer, который подготавливает сетевой поток.Пока он еще готовится, я выделяю другой экземпляр MediaPlayer и пытаюсь установить источник данных в локальный файл.Метод setDataSource блокируется до завершения подготовки первого экземпляра MediaPlayer.Я тестировал только с помощью эмулятора.У вас есть идеи, почему это происходит?Насколько я знаю, 2 экземпляра 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 - даже с prepareAsync), был заблокирован.Почему это происходит ?Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

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

0 голосов
/ 28 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...