Android音频流服务:MediaPlayer错误-1004

时间:2016-07-05 16:13:30

标签: android android-mediaplayer audio-streaming

我坚持这个问题:

我对Android很陌生,我目前正在尝试开发一种简单的服务来传输来自网络数据源(网络广播)的音频。
这项服务是我发现的最简单的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();
}

一开始我使用的是测试网址,更具体地说是http://icecast.omroep.nl/radio1-bb-mp3,一切正常 今天我收到了明确的网址:http://eu3.radioboss.fm:8037/live,MediaPlayer开始给我MEDIA_ERROR_IO(-1004)。

我已经读过这可能是由不受支持的媒体格式引起的,但我不知道如何获得流的编码。
而真正的问题是,我绝对无法控制最终的URL。

有人可以建议我如何才能使最终的音频源工作?

1 个答案:

答案 0 :(得分:1)

最后,事实证明最简单的解决方案是使用ExoPlayer

正如开发者指南所说,MediaCodecVideoTrackRenderer和MediaCodecAudioTrackRenderer"可以处理给定Android设备支持的所有音频和视频格式"。

我是如何使用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);
}

希望这会对某人有所帮助。