NOTE: I'm not working at the company where I worked when I posted this question, therefore, even though some great answers might come
in, I won't actually be testing them since I don't have a reason to
(other than promoting the community; which might cause me to do it one
day).
If however, some answer to the problem is promoted by many other
comunity members, I might opt to select it as the correct answer for
the problem experienced so many years after I originally posted the
question.
In the meantime, I hope some of the answers may help some of you also
experiencing this problem. Yay for Stack Overflow!
Our application has to stream music from an online source (I'm not at liberty to disclose that source).
Why does it take over 2 minutes to start streaming on the S3?
I've been able to figure out that the Media Player object goes into the Error state due to MEDIA_ERROR_UNKOWN - great. Doesn't help me much. So upon handling this in onError with an OnErrorListener, I reset the Media Player object and then call startPlaying which does the rest - setting the data source, etc.
Members:
private ProgressBar playSeekBar;
private ImageView ivPlay;
private ImageView ivPause;
private ImageView ivBuffer;
private MediaPlayer mPlayer;
private ImageView ivInfo;
private AudioManager audio;
Initializing the Media Player (and Visualizer - which is not the issue for the purpose of this question)
private void initialMediaPlayerAndVisualizer() {
Log.d(TAG, "Initial Media Player and Visualizer");
playSeekBar = (ProgressBar) findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.GONE);
mPlayer = new MediaPlayer();
Log.d(TAG, "Create onErrorListener");
MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d(TAG, "OnError - Error code: "+what+" Extra code: "+extra);
switch(what){
case -1004:
Log.d("Streaming Media", "MEDIA_ERROR_IO");
break;
case -1007:
Log.d("Streaming Media", "MEDIA_ERROR_MALFORMED");
break;
case 200:
Log.d("Streaming Media", "MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK");
break;
case 100:
Log.d("Streaming Media", "MEDIA_ERROR_SERVER_DIED");
break;
case -110:
Log.d("Streaming Media", "MEDIA_ERROR_TIMED_OUT");
break;
case 1:
Log.d("Streaming Media", "MEDIA_ERROR_UNKNOWN");
break;
case -1010:
Log.d("Streaming Media", "MEDIA_ERROR_UNSUPPORTED");
break;
}
switch(extra){
case 800:
Log.d("Streaming Media", "MEDIA_INFO_BAD_INTERLEAVING");
break;
case 702:
Log.d("Streaming Media", "MEDIA_INFO_BUFFERING_END");
break;
case 701:
Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
break;
case 802:
Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
break;
case 801:
Log.d("Streaming Media", "MEDIA_INFO_NOT_SEEKABLE");
break;
case 1:
Log.d("Streaming Media", "MEDIA_INFO_UNKNOWN");
break;
case 3:
Log.d("Streaming Media", "MEDIA_INFO_VIDEO_RENDERING_START");
break;
case 700 :
Log.d("Streaming Media", "MEDIA_INFO_VIDEO_TRACK_LAGGING");
break;
}
Log.d("Streaming Media", "Reset media player");
mPlayer.reset();
// We need to link the visualizer view to the media player so that it displays something
mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);
//Send the visualizerContainer to the Renderer
visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
mVisualizerManager.addRenderer(visualizerRenderer);
try {
startPlaying();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
};
Log.d(TAG, "Set error listener on Media Player object");
mPlayer.setOnErrorListener(errorListener);
// We need to link the visualizer view to the media player so that it displays something
mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);
//Send the visualizerContainer to the Renderer
visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
mVisualizerManager.addRenderer(visualizerRenderer);
try {
startPlaying();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Start playing:
private void startPlaying () throws IllegalStateException, IOException, UnsupportedOperationException
{
if(mPlayer != null){
ivPause.setVisibility(View.INVISIBLE);
ivPlay.setVisibility(View.INVISIBLE);
ivBuffer.setVisibility(View.VISIBLE);
mVisualizerManager.link(mPlayer);
mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
playSeekBar.setSecondaryProgress(percent);
Log.i("Buffering", "" + percent);
}
});
try {
mPlayer.setDataSource(theSource);
} catch (IllegalArgumentException e) {
Log.d(TAG, "Illegal Argument Exception: "+e);
e.printStackTrace();
} catch (IllegalStateException e) {
Log.d(TAG, "Illegal State Exception: "+e);
e.printStackTrace();
} catch (IOException e) {
Log.d(TAG, "IO Exception: "+e);
e.printStackTrace();
}
mPlayer.prepareAsync();
mPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
ivBuffer.setVisibility(View.INVISIBLE);
bars.setVisibility(View.INVISIBLE);
visualizerContainer.setVisibility(View.VISIBLE);
ivInfo.setImageResource(R.drawable.img_radio_info_online);
ivPause.setVisibility(View.VISIBLE);
ivPlay.setVisibility(View.INVISIBLE);
//Mute the video if the phone is muted.
if ((audio.getRingerMode() == AudioManager.RINGER_MODE_SILENT) || (audio.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) {
mp.setVolume(0, 0);
Toast toast = Toast.makeText(context, R.string.device_muted, Toast.LENGTH_LONG);
toast.show();
}
mPlayer.start();
}
});
}else{
Log.d(TAG, "Media player is null.");
initialMediaPlayerAndVisualizer();
}
}
Stop playing:
private void stopPlaying()
{
bars.setVisibility(View.VISIBLE);
visualizerContainer.setVisibility(View.INVISIBLE);
ivInfo.setImageResource(R.drawable.img_radio_info_offline);
ivPlay.setVisibility(View.VISIBLE);
ivPause.setVisibility(View.INVISIBLE);
mPlayer.stop();
mVisualizerManager.release();
mPlayer.release();
mPlayer = null;
}
A little logs:
05-21 16:26:23.600: I/Buffering(3921): 0
05-21 16:26:23.600: I/MediaPlayer(3921): Info (703,156)
05-21 16:26:23.600: I/MediaPlayer(3921): Info (701,0)
05-21 16:26:23.610: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.715: V/MediaPlayer(3921): message received msg=100, ext1=1, ext2=-110
05-21 16:26:23.715: E/MediaPlayer(3921): error (1, -110)
05-21 16:26:23.715: V/MediaPlayer(3921): callback application
05-21 16:26:23.715: V/MediaPlayer(3921): back from callback
05-21 16:26:23.725: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.725: E/MediaPlayer(3921): Error (1,-110)
05-21 16:26:23.725: D/MAIN(3921): OnError - Error code: 1 Extra code: -110
05-21 16:26:23.725: D/Streaming Media(3921): MEDIA_ERROR_UNKNOWN
05-21 16:26:23.725: D/Streaming Media(3921): Reset media player
05-21 16:26:23.725: V/MediaPlayer-JNI(3921): reset
05-21 16:26:23.725: V/MediaPlayer(3921): reset
05-21 16:26:23.730: D/VisualizerRenderer(3921): Divisions: 9
05-21 16:26:23.730: D/VisualizerManager(3921): Added te renderer
05-21 16:26:23.730: V/MediaPlayer-JNI(3921): get_session_id()
05-21 16:26:23.735: D/VisualizerManager(3921): Media player and visualizer linked
05-21 16:26:23.735: D/VisualizerManager(3921): Set capture listener
05-21 16:26:23.735: D/VisualizerManager(3921): Set on visualizer complete listener
05-21 16:26:23.740: V/MediaPlayer(3921): setVideoSurfaceTexture
05-21 16:26:23.740: V/MediaPlayer(3921): prepareAsync
05-21 16:26:25.285: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.285: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.285: V/MediaPlayer(3921): callback application
05-21 16:26:25.285: V/MediaPlayer(3921): back from callback
05-21 16:26:25.330: I/Buffering(3921): 0
05-21 16:26:25.390: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.390: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.390: V/MediaPlayer(3921): callback application
05-21 16:26:25.390: V/MediaPlayer(3921): back from callback
05-21 16:26:25.425: I/Buffering(3921): 0
05-21 16:26:25.490: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.490: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.490: V/MediaPlayer(3921): callback application
05-21 16:26:25.490: V/MediaPlayer(3921): back from callback
...
05-21 16:26:52.585: I/Buffering(3921): 0
05-21 16:26:53.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:53.570: V/MediaPlayer(3921): buffering 0
05-21 16:26:53.570: V/MediaPlayer(3921): callback application
05-21 16:26:53.570: V/MediaPlayer(3921): back from callback
05-21 16:26:53.585: I/Buffering(3921): 0
05-21 16:26:54.570: V/MediaPlayer(3921): message received