【问题标题】:MediaPlayer android stream radio starts not immediately or does not start at allMediaPlayer android 流广播未立即启动或根本不启动
【发布时间】:2025-12-05 17:05:02
【问题描述】:

我使用这个代码:

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 上,我尝试使用的所有无线电流都会立即开始播放

对不起,我的英语不好,谢谢。

【问题讨论】:

    标签: java android media-player android-mediaplayer audio-streaming


    【解决方案1】:

    如果有人出于同样的原因来到这里(以防万一),解决方案是 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

    【讨论】:

    • 我是原始问题的作者,使用 ExoPlayer 代替默认的 android 媒体播放器可以完全解决问题。 FFmpegMediaPlayer,从接受的答案,有一个问题github.com/wseemann/FFmpegMediaPlayer/issues/133,目前还没有解决。或者你告诉我也把这个作为评论,而不是这个答案?
    • 也许改进答案以包含说明如何使用 ExoPlayer 而不是默认值的代码? - “解决方案是 ExoPlayer”几乎不是任何人都可以使用的答案,iMHO
    【解决方案2】:

    似乎音频比特率可能是这里的关键:https://*.com/a/12850965/3454741。似乎没有简单的方法可以解决这个问题。

    如果流式传输根本没有开始,可能是由于某些错误,您可以使用 MediaPlayer.setOnErrorListener() 捕获。

    【讨论】:

    • 感谢您的回答。这是可悲的。您如何看待加载临时 mp3 文件队列并使用完成侦听器播放它们。但是如何使每个文件都变成一个大小(例如 512kb)? read(byte[]) 可以读取从 0 到整个 bute 数组大小的内容,但我不想要任何零大小的文件。
    • 我不确定使用 MP3 是否能解决这个问题,你可以试试。我不太明白您关于“使它们成为一种尺寸”的问题......另外,the answer just above the one I linked 建议使用 FFmpegMediaPlayer,它似乎表现更好。
    • 离工作太近了。在模拟器上 FFmpegMP 工作正常,但在我的小米方法上停止导致致命错误...