如何使用 MediaPlayer 流式传输在线 URL?
5 回答
基本上,如果您使用的是 Android MediaPlayer 类,则需要执行以下操作:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.reset();
return false;
}
});
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
try {
mediaPlayer.setDataSource("http://someurl");
mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
请记住,Android MediaPlayer 类只会播放支持的格式:http: //developer.android.com/guide/appendix/media-formats.html
在 API 28 中为我工作
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("http://209.188.21.202:8016/stream");
mediaPlayer.prepare();
mediaPlayer.start();
如果使用 INTERNET,请记住向清单添加权限
<uses-permission android:name="android.permission.INTERNET" />
还要小心使用明文交通
从 Android 9.0(API 级别 28)开始,默认情况下禁用明文支持。
就我而言,我在清单中添加 --> android:usesCleartextTraffic="true"
参考 -->
你可以使用这个:
MediaPlayer mediaPlayer = MediaPlayer.create(this, Uri.parse("YOUR URL HERE"));
mediaPlayer.start();
public class MainActivity extends ActionBarActivity {
String vidAddress ="your http link";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
VideoView vidView = (VideoView)findViewById(R.id.myVideo);
Uri vidUri = Uri.parse(vidAddress);
vidView.setVideoURI(vidUri);
MediaController vidControl = new MediaController(this);
vidControl.setAnchorView(vidView);
vidView.setMediaController(vidControl);
vidView.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
如果您从远程 URL 流式传输音频,则 MediaPlayer 是错误的。它有时有效,但主要用于远程挂起。
试过下面挂起
mediaPlayer = MediaPlayer.create(this, Uri.parse("YOUR URL HERE"));
mediaPlayer.start();
还尝试了 mediaPlayer.prepareAsync(); 并实现onprepared listener。不起作用..使用的设备是三星galaxy mini
一直在尝试手动读取 URL 内容并使用缓冲内容更新 MediaPlayer 数据源。工作得很好,但还没有弄清楚如何切换 URL 等。
这里的示例适用于 VideoPlayer,但对于音频播放器也应该是相同的概念
编辑
啊刚刚发现这个http://launch-code.blogspot.co.uk/2012/01/android-play-audio-asyncplayer.html
似乎很好地包装了对 MediaPlayer 的调用:http: //www.netmite.com/ android/mydroid/frameworks/base/media/java/android/media/AsyncPlayer.java