【发布时间】:2013-12-04 17:47:38
【问题描述】:
我已成功使用媒体播放器播放许多提供音频/无线电流的 Url,但我发现一些特殊情况下它不起作用, 媒体播放器永远不会到达 onPrepared。我已经用 VLC 进行了测试,它们播放得很好,格式正确。
甚至,我已经检查过,如果我像这里评论 http://blog.pocketjourney.com/2008/04/04/tutorial-custom-media-streaming-for-androids-mediaplayer/ 那样进行缓存,它可以工作,数据被下载,MediaPlayer 可以在之后播放它。
未播放的网址是:
http://makrodigital.com:8014/forever?type=.mp3
http://makrodigital.com:8014/radioforevermusic?type=.mp3
代码:
private void prepareAndPlay() {
player = new MediaPlayer();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnPreparedListener(this);
player.setOnErrorListener(this);
player.setOnBufferingUpdateListener(this);
player.setOnInfoListener(this);
try {
player.setDataSource(getActivity().getBaseContext(),Uri.parse(getURL()));
player.prepareAsync();
} catch (Exception e) {
Log.e(TAG," Setting data source " + getParam(),e);
buildErrorPopup();
return;
}
}
// In the problematic URLs it is never called
@Override
public void onPrepared(MediaPlayer mp) {
try {
mp.start();
} catch(Exception e) {
e.printStackTrace();
}
}
如果 alsa 没有运气测试这个:
//Setting HTTP header for fixing some issues with normal setDataSource Header from Android
//User-Agent "iTunes" was set to force re-direct to shoutcast streaming url
Map<String, String> headers = new HashMap<String, String>();
headers.put("User-Agent", "iTunes");
player.setDataSource(getActivity().getBaseContext(), Uri.parse(getParam()), headers);
问题是,是否有任何方法可以使用 MediaPlayer 直接播放此 URL,以避免实现适用于所有可能场景的缓存的复杂性?
如果看到这里有一个低级媒体 API,Best practices for audio streaming。
【问题讨论】:
-
通过您的 OnErrorListener 和 OnInfoListener 实现检查 logcat 是否有任何可能表明出现问题的内容。
-
避免在android项目中使用
e.printStackTrace();,而是使用android sdk提供的日志类LOG ...类似于Log.e("TAG", e.getMessage(), e); -
@petey ,我已经检查过了,没有报告任何错误,也没有任何进一步的信息。它正在等待开始。关于 .printStackTrace(),你是对的,我避免使用它们,它是自动生成的测试代码。
-
哪个版本的android?
-
我在 Android 4.1.2 中测试过。
标签: android audio streaming android-mediaplayer