Android 音频流服务:MediaPlayer 错误 -1004
Android Audio Streaming Service: MediaPlayer error -1004
我被这个问题困住了:
我是 Android 的新手,我目前正在尝试开发一个简单的服务来从 URL 数据源(网络广播)流式传输音频。
该服务具有我所发现的最简单的 MediaPlayer 实现之一,例如:
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
}
catch (Exception ex) {
ex.printStackTrace();
}
一开始我使用了测试 URL,更具体地说 http://icecast.omroep.nl/radio1-bb-mp3,一切正常。
今天我得到了明确的 URL: http://eu3.radioboss.fm:8037/live 并且 MediaPlayer 开始给我 MEDIA_ERROR_IO (-1004)。
我了解到这可能是由不受支持的媒体格式引起的,但我不知道如何获得流的编码。
真正的问题是我完全无法控制最终的 URL。
有人可以建议我如何使最终音频源正常工作吗?
最后发现,最简单的解决方案是使用ExoPlayer。
正如开发者指南所说,MediaCodecVideoTrackRenderer 和 MediaCodecAudioTrackRenderer "can handle all audio and video formats supported by a given Android device"。
这就是我使用 ExoPlayer 初始化网络广播的方式:
private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 256;
private void initMediaPlayer() {
// We create an ExoPlayer with argument 1 because
// we are going to use exclusively an audio renderer
ExoPlayer player = ExoPlayer.Factory.newInstance(1);
// String with the url of the radio we want to play
String url = "http://eu3.radioboss.fm:8037/live";
Uri radioUri = Uri.parse(url);
// Settings for our ExoPlayer
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
String userAgent = Util.getUserAgent(this, "AudioStreamService");
DataSource dataSource = new DefaultUriDataSource(this, null, userAgent);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri,
dataSource,
allocator,
BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT
);
this.audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource, MediaCodecSelector.DEFAULT);
// Prepare ExoPlayer
player.prepare(this.audioRenderer);
}
希望这会对某人有所帮助。
我被这个问题困住了:
我是 Android 的新手,我目前正在尝试开发一个简单的服务来从 URL 数据源(网络广播)流式传输音频。
该服务具有我所发现的最简单的 MediaPlayer 实现之一,例如:
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
}
catch (Exception ex) {
ex.printStackTrace();
}
一开始我使用了测试 URL,更具体地说 http://icecast.omroep.nl/radio1-bb-mp3,一切正常。
今天我得到了明确的 URL: http://eu3.radioboss.fm:8037/live 并且 MediaPlayer 开始给我 MEDIA_ERROR_IO (-1004)。
我了解到这可能是由不受支持的媒体格式引起的,但我不知道如何获得流的编码。
真正的问题是我完全无法控制最终的 URL。
有人可以建议我如何使最终音频源正常工作吗?
最后发现,最简单的解决方案是使用ExoPlayer。
正如开发者指南所说,MediaCodecVideoTrackRenderer 和 MediaCodecAudioTrackRenderer "can handle all audio and video formats supported by a given Android device"。
这就是我使用 ExoPlayer 初始化网络广播的方式:
private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 256;
private void initMediaPlayer() {
// We create an ExoPlayer with argument 1 because
// we are going to use exclusively an audio renderer
ExoPlayer player = ExoPlayer.Factory.newInstance(1);
// String with the url of the radio we want to play
String url = "http://eu3.radioboss.fm:8037/live";
Uri radioUri = Uri.parse(url);
// Settings for our ExoPlayer
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
String userAgent = Util.getUserAgent(this, "AudioStreamService");
DataSource dataSource = new DefaultUriDataSource(this, null, userAgent);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri,
dataSource,
allocator,
BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT
);
this.audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource, MediaCodecSelector.DEFAULT);
// Prepare ExoPlayer
player.prepare(this.audioRenderer);
}
希望这会对某人有所帮助。