MediaPlayer 在从 url 播放时未准备好:MediaPlayer:尝试在没有有效媒体播放器的情况下调用 getDuration
MediaPlayer is not preparing while playing from a url: MediaPlayer: Attempt to call getDuration without a valid mediaplayer
我正在开发一个应用程序,它使用 HTTP 连接 url 将一个 android phone 上的歌曲播放到另一个上。这是我初始化和启动 MediaPlayer 的代码:-
Log.d(TAG, "Rohit insidePlaysong of client");
mp.reset();
Log.d(TAG, "Rohit Music player is reset");
mp.setDataSource(url);
Log.d(TAG, "Rohit Music player : data source set");
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.d(TAG, "Rohit Music player audio stream type set");
//mp.prepare();
//Rohit changing the method of preparing
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
Log.d(TAG, "Rohit inside onPrepared, Now starting Music Player");
mp.start();
}
});
mp.prepareAsync();
//mp.prepare();
//Log.d(TAG, "Rohit Music player prepared");
// TODO: make sure we have buffered REALLY
// buffered the music, currently this is a big
// HACK and takes a lot of time. We can do
// better!
/*mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();*/
Log.d(TAG, "Rohit Music player started");
musicTimer = mActivity.retrieveTimer();
Log.d(TAG, "Rohit retrieved timer");
// let the music timer determine when to play the future playback
musicTimer.playFutureMusic(mp, startTime, startPos);
Log.d(TAG, "Rohit future music set to timer");
// Changing Button Image to pause image
// btnPlay.setImageResource(R.drawable.btn_pause);
// set Progress bar values
songProgressBar.setProgress(0);
songProgressBar.setMax(100);
// Updating progress bar
updateProgressBar();
// parsing songTitle
Log.d(TAG, "Rohit updated song progress");
这些是打印的相应日志(使用 "Rohit" 过滤):-
12-19 19:25:42.827 463 463 D Speaker Music Player: Rohit insidePlaysong of client
12-19 19:25:42.827 463 463 D Speaker Music Player: Rohit Music player is reset
12-19 19:25:42.847 463 463 D Speaker Music Player: Rohit Music player : data source set
12-19 19:25:42.847 463 463 D Speaker Music Player: Rohit Music player audio stream type set
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit Music player started
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit retrieved timer
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit future music set to timer
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit updated song progress
如您所见,"Rohit inside onPrepared, Now starting Music Player" 从未准备好。
尽管从 url 我可以看到 MediaPlayer 能够正确获取歌曲名称,但是在我的代码中使用 mp.getDuration() 时我在日志中收到以下错误:-
12-19 19:25:42.857 463 463 V MediaPlayer: getDuration_l<br>
12-19 19:25:42.857 463 463 E MediaPlayer: Attempt to call getDuration without a valid mediaplayer
12-19 19:25:42.857 463 463 V MediaPlayer: message received msg=100, ext1=-38, ext2=0
12-19 19:25:42.857 3237 1397 V GenericSource: [Flag] set 0x8 -> mFlags = 0x8
12-19 19:25:42.857 3237 1398 V GenericSource: onPrepareAsync<br>
12-19 19:25:42.857 6089 6096 I art : Ignoring second debugger -- accepting and dropping
12-19 19:25:42.857 463 463 E MediaPlayer: error (-38, 0)<br>
12-19 19:25:42.857 463 463 V MediaPlayer: callback application
12-19 19:25:42.857 3438 3502 V BroadcastQueue: [background] Process cur broadcast BroadcastRecord{62bf8b6 u0 com.samsung.android.providers.context.log.action.USE_APP_FEATURE_SURVEY qIdx=4}, state= (APP_RECEIVE) DELIVERED for app ProcessRecord{98bbb0 6103:com.samsung.android.providers.context/u0a8}
12-19 19:25:42.857 463 463 V MediaPlayer: back from callback
12-19 19:25:42.857 463 463 V MediaPlayer-JNI: getDuration: 0 (msec)
谁能帮我看看,MediaPlayer无法准备的可能原因是什么?
您正试图在不等待 MediaPlayer
准备的情况下获取持续时间。在准备好之前,您不必使用 MediaPlayer
。所以下面的代码 prepareAsync
必须在 prepareListener
回调中调用:
mp.reset();
mp.setDataSource(url);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
//any further actions on mediaPlayer here
}
});
mp.prepareAsync();
我正在开发一个应用程序,它使用 HTTP 连接 url 将一个 android phone 上的歌曲播放到另一个上。这是我初始化和启动 MediaPlayer 的代码:-
Log.d(TAG, "Rohit insidePlaysong of client");
mp.reset();
Log.d(TAG, "Rohit Music player is reset");
mp.setDataSource(url);
Log.d(TAG, "Rohit Music player : data source set");
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.d(TAG, "Rohit Music player audio stream type set");
//mp.prepare();
//Rohit changing the method of preparing
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
Log.d(TAG, "Rohit inside onPrepared, Now starting Music Player");
mp.start();
}
});
mp.prepareAsync();
//mp.prepare();
//Log.d(TAG, "Rohit Music player prepared");
// TODO: make sure we have buffered REALLY
// buffered the music, currently this is a big
// HACK and takes a lot of time. We can do
// better!
/*mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();
mp.start();
mp.pause();*/
Log.d(TAG, "Rohit Music player started");
musicTimer = mActivity.retrieveTimer();
Log.d(TAG, "Rohit retrieved timer");
// let the music timer determine when to play the future playback
musicTimer.playFutureMusic(mp, startTime, startPos);
Log.d(TAG, "Rohit future music set to timer");
// Changing Button Image to pause image
// btnPlay.setImageResource(R.drawable.btn_pause);
// set Progress bar values
songProgressBar.setProgress(0);
songProgressBar.setMax(100);
// Updating progress bar
updateProgressBar();
// parsing songTitle
Log.d(TAG, "Rohit updated song progress");
这些是打印的相应日志(使用 "Rohit" 过滤):-
12-19 19:25:42.827 463 463 D Speaker Music Player: Rohit insidePlaysong of client
12-19 19:25:42.827 463 463 D Speaker Music Player: Rohit Music player is reset
12-19 19:25:42.847 463 463 D Speaker Music Player: Rohit Music player : data source set
12-19 19:25:42.847 463 463 D Speaker Music Player: Rohit Music player audio stream type set
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit Music player started
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit retrieved timer
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit future music set to timer
12-19 19:25:42.857 463 463 D Speaker Music Player: Rohit updated song progress
如您所见,"Rohit inside onPrepared, Now starting Music Player" 从未准备好。
尽管从 url 我可以看到 MediaPlayer 能够正确获取歌曲名称,但是在我的代码中使用 mp.getDuration() 时我在日志中收到以下错误:-
12-19 19:25:42.857 463 463 V MediaPlayer: getDuration_l<br>
12-19 19:25:42.857 463 463 E MediaPlayer: Attempt to call getDuration without a valid mediaplayer
12-19 19:25:42.857 463 463 V MediaPlayer: message received msg=100, ext1=-38, ext2=0
12-19 19:25:42.857 3237 1397 V GenericSource: [Flag] set 0x8 -> mFlags = 0x8
12-19 19:25:42.857 3237 1398 V GenericSource: onPrepareAsync<br>
12-19 19:25:42.857 6089 6096 I art : Ignoring second debugger -- accepting and dropping
12-19 19:25:42.857 463 463 E MediaPlayer: error (-38, 0)<br>
12-19 19:25:42.857 463 463 V MediaPlayer: callback application
12-19 19:25:42.857 3438 3502 V BroadcastQueue: [background] Process cur broadcast BroadcastRecord{62bf8b6 u0 com.samsung.android.providers.context.log.action.USE_APP_FEATURE_SURVEY qIdx=4}, state= (APP_RECEIVE) DELIVERED for app ProcessRecord{98bbb0 6103:com.samsung.android.providers.context/u0a8}
12-19 19:25:42.857 463 463 V MediaPlayer: back from callback
12-19 19:25:42.857 463 463 V MediaPlayer-JNI: getDuration: 0 (msec)
谁能帮我看看,MediaPlayer无法准备的可能原因是什么?
您正试图在不等待 MediaPlayer
准备的情况下获取持续时间。在准备好之前,您不必使用 MediaPlayer
。所以下面的代码 prepareAsync
必须在 prepareListener
回调中调用:
mp.reset();
mp.setDataSource(url);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
//any further actions on mediaPlayer here
}
});
mp.prepareAsync();