2011-12-27 16 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呼び出しの前に(ありますオブジェクト)。
太字の2番目のタイムスタンプは、setDataSourceメソッドの終了後です。
13秒の違いがあります。これは、setDataSourceメソッド(完全に異なるMediaPlayerオブジェクトで呼び出され、最初のMediaPlayerオブジェクトが準備中であってもprepareAsyncであっても)がブロックされた時間です。
なぜこれが起こっていますか?私は何か間違っているのですか?

答えて

0

prepare()を使用すると、最初のものが準備を完了するまで、2番目のMediaPlayerが待機するように、ネットワークからストリームを最初に取得します。

+0

私の質問を編集しました。上記を参照してください。 –

+0

あなたのコードで私の答えを適用し、次に別のエラーで質問を編集すると、すべての人が私の答えに専念します。 – confucius

+0

私は本当にあなたがここで何を意味するのか分かりません。別のエラー?これは以前のことを話しているエラーです(最初の準備が終わるまでsetDataSourceブロック)。私のプログラムではすでにprepareAsyncメソッドを使用していたので、私はあなたの答えを "適用"しませんでした。それは本当です、私はそれを述べることを忘れました。また、前もってprepareを使っていたのであれば、UIがブロックされてしまったので、setDatasourceを再び呼び出すことができませんでした。たぶん別のスレッドからのものかもしれませんが、ブロックされていないでしょう。より積極的になってください。 –

0

私は、別のネットワークURL(http://listen.radionomy.com/radio-mozart)をmp3ストリームとして使用すると、問題が解消されたことがわかりました。 setDataSourceはこれ以上ブロックしません。元のURLはAPI8 MediaPlayerでサポートされていないaacストリームでした。しかし、他のMediaPlayerで呼び出されたsetDataSourceメソッドは、私の意見ではブロックしてはいけません。これはAndroidのバグですか?今度は、setDataSourceがブロックするときにこの状況に対処する必要があります。

関連する問題