我用这个代码:
mediaPlayer.setDataSource("http://some online radio");
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync();
和onPrepared
方法是:
if (mediaPlayer != null) {
mediaPlayer.start();
}
一般来说,问题是:然后我运行此代码,播放不会立即开始,但大约10秒后。 +某些流根本没有启动,在模拟器上它比在设备上工作得更好,但仍然如此。这取决于具体的收音机,有些更好,其他非常糟糕。
我认为问题在于准备和缓冲。有可能从这个流制作一个InputStream
并写入一些临时文件/缓冲区,并在MediaPlayer
中读取/播放这个文件,但是如何实现它,还不清楚..请帮助
如果你只是做mp.prepare
,然后mp.start
- 结果是一样的
在Chrome中的PC上,我尝试使用的所有无线电流都会立即开始播放
对不起我的英文,谢谢。
似乎音频比特率可能是关键:https://stackoverflow.com/a/12850965/3454741。似乎没有简单的方法来解决这个问题。
如果流式传输根本没有启动,可能是由于某些错误,您可以使用MediaPlayer.setOnErrorListener()捕获。
如果有人因为同样的原因到达这里(以防万一),解决方案是ExoPlayer
像这样的东西:
LoadControl loadControl = new DefaultLoadControl();
bandwidthMeter = new DefaultBandwidthMeter();
extractorsFactory = new DefaultExtractorsFactory();
trackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(trackSelectionFactory);
defaultBandwidthMeter = new DefaultBandwidthMeter();
dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "mediaPlayerSample"), defaultBandwidthMeter);
mediaSource = new ExtractorMediaSource(Uri.parse(radioURL), dataSourceFactory, extractorsFactory, null, null);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
player.prepare(mediaSource);
player.setPlayWhenReady(true);
但是你最好在这里查看实际版本的例子:https://github.com/google/ExoPlayer