2011-12-27 4 views
1

네트워크 스트림을 준비중인 MediaPlayer 인스턴스가 있습니다. 아직 준비 중이지만 다른 MediaPlayer 인스턴스를 할당하고 데이터 소스를 로컬 파일로 설정하려고합니다. setDataSource 메서드는 첫 번째 MediaPlayer 인스턴스가 준비 작업을 마칠 때까지 차단됩니다. 나는 단지 에뮬레이터를 사용하여 테스트했다. 왜 이런 일이 일어나는 지 아십니까? 내가 아는 한 2 MediaPlayer 인스턴스는 독립적으로 동작해야합니다. 감사합니다.다른 MediaPlayer 인스턴스가 준비를 마칠 때까지 Android MediaPlayer setDataSource가 차단됩니다.

내 응용 프로그램 외부에 작은 테스트를 만들었습니다. 이것은 내에서 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 초의 차이가 있습니다. 첫 번째 MediaPlayer 객체를 준비하는 동안 - prepareAsync와 함께 있어도 - 완전히 다른 MediaPlayer 객체에서 호출 된 setDataSource 메서드가 차단 된 시간입니다.
왜 이런 일이 발생합니까? 내가 뭔가 잘못하고 있는거야?

답변

0

prepare()을 사용하면 네트워크에서 스트림을 얻는 첫 번째 메시지와 함께 prepareAsync()을 사용하여 UI 스레드를 차단하므로 두 번째 MediaPlayer는 준비가 끝날 때까지 대기합니다.

+0

내 질문을 편집했습니다. 위를 참조하십시오. –

+0

코드에서 내 대답을 적용한 다음 다른 오류로 질문을 편집하면 모든 사람이 내 대답에 헌신 할 것입니다. 왜 그럴까요? – confucius

+0

나는 여기서 당신이 의미하는 것을 정말로 이해하지 못합니다. 또 다른 오류가 있습니까? 이것은 이전에 얘기했던 오류입니다 (첫 번째 준비가 끝날 때까지 setDataSource 블록). 그리고 내 프로그램에서 이미 prepareAsync 메소드를 사용하고 있었기 때문에 답을 "적용"하지 않았습니다. 사실입니다. 진술을 잊어 버렸습니다. 게다가 UI를 차단했기 때문에 이전에 준비를 사용했다면 setDatasource를 다시 호출 할 수 없었습니다. 어쩌면 다른 스레드에서 나온 것일 수도 있지만 차단되지 않았을 것입니다. 더 적극적으로 참여하십시오. –

0

나는 mp3 스트림 인 다른 네트워크 URL (http://listen.radionomy.com/radio-mozart)을 사용하면 문제가 사라진다는 것을 발견했습니다. setDataSource가 더 이상 차단하지 않습니다. 원래 URL은 API8 MediaPlayer에서 지원하지 않는 aac 스트림이었습니다. 하지만 여전히 다른 MediaPlayer에서 호출 된 setDataSource 메서드는 내 의견으로는 차단되어서는 안됩니다. Android 버그입니까? 이제 setDataSource가 차단되면이 상황을 해결해야합니다.