Android MediaPlayer setDataSource阻塞,直到另一个MediaPlayer实例完成准备

时间:2011-12-27 23:49:22

标签: android media-player blocking

我正在准备一个准备网络流的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 :(得分:0)

使用prepareAsync ()与第一个从网络获取流量的{{3}},因为使用prepare()将阻止您的UI线程,以便第二个MediaPlayer将等到第一个完成准备。

答案 1 :(得分:0)

我刚刚发现,如果我使用另一个网络网址(http://listen.radionomy.com/radio-mozart)这是一个mp3流,问题就会消失。 setDataSource不再阻止。原始网址是API8 MediaPlayer不支持的aac流。但是,在我看来,在另一个MediaPlayer上调用的setDataSource方法不应该阻止。这是Android的错误吗?现在,当setDataSource阻塞时,我将不得不解决这种情况。