stream式传输audio时MediaPlayer缓冲时间问题

我使用MediaPlayer通过HTTPstream式传输广播。 在棒棒糖我的stream大约需要一分钟,开始这是不可接受的。 Kitkat大概需要20秒钟,这已经很痛苦,但现在变得无法使用了。

这个与缓冲有关的组件有一个众所周知的问题 :要缓冲的字节数是被编码的,不能被改变。

我的代码是非常标准的

 player.reset(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setDataSource(streamUrl); player.prepareAsync(); 

并准备我做的

 player.start(); 

我听说GStreamer替代品,但我不能让它在Windows上工作。

我想知道是否有人有一个工作的解决scheme,通过HTTPstream式无线电与一个体面的开始延迟。

编辑

我testing了ExoPlayer,但是我得到的低开始时间是15秒。 玩家被困在“准备”状态(而不是缓冲,这是我后来看到的)。

编辑

stream的格式是AAC

编辑

我testing了https://code.google.com/p/aacdecoder-android/,但是这个库唯一的问题是缺less对暂停的支持。 这是我的应用程序支持在线stream暂停的要求。

Solutions Collecting From Web of "stream式传输audio时MediaPlayer缓冲时间问题"

如果您的用例与GPL / LGPL许可证兼容,那么VLC应该正是您所需要的。 VLC能够在3Gnetworking上从您的urlstream式传输,延迟时间只有1秒。

步骤1:下载VLC源代码并按照指令进行编译

第2步:最重要的类是org.videolan.vlc.audio.AudioServiceController ,它是从org.videolan.vlc.gui.MRLPanelFragement.processUri() --> org.videolan.vlc.util.Util.openStream(Context, String) --> AudioServiceController.load(String, boolean) 。 您可以删除AudioServiceController及其支持类以外的所有不必要的代码,以缩小尺寸

我可以build议从MediaPlayer切换到ExoPlayer 。 使用ExoPlayer可以设置缓冲参数如下:

 public static ExoPlayer newInstance(int rendererCount, int minBufferMs, int minRebufferMs) { return new ExoPlayerImpl(rendererCount, minBufferMs, minRebufferMs); } 

minBufferMS意味着数据的最小持续时间,为了回放,必须缓冲以在用户动作(例如寻道)之后开始或恢复。

minRebufferMs表示在播放器调用重新sorting器(即,由于缓冲器耗尽而不是由于诸如开始重放或寻找的用户动作而发生的重新缓冲器)之后必须被缓冲用于重放的数据的最小持续时间。

默认值分别是500和5000。

你应该避免媒体播放器的直播电台stream。

我已经使用了下面的库,它工作得很好: https : //code.google.com/p/aacdecoder-android/

stream式传输有2种延迟。 是启动延迟的缓冲延迟,b。 是广播延迟。

在媒体播放器的情况下,stream将花费1分钟来缓冲。 所以我们首先需要看看如何减less填充缓冲区的时间。 我不确定是否可以在Android的媒体播放器代码中configuration缓冲区大小。

但是,如果我们尝试使用Android的AAC解码器库( https://code.google.com/p/aacdecoder-android/downloads/detail?name=aacdecoder- android-0.8.zip),那么我们有条款来填补input缓冲区。

PL。 请参阅下面的代码片段,您可以根据您的要求填写您的input缓冲区容量,然后您可以开始播放。 由于我们已经控制了input缓冲区容量,我们可以尝试减less时间延迟来开始播放。 PL。 检查这是否可以帮助你。

  /** * Sets the audio buffer (AudioTrack) capacity. * The capacity can be expressed in time of audio playing of such buffer. * For example 1 second buffer capacity is 88100 samples for 44kHz stereo. * By setting this the audio will start playing after the audio buffer is first filled. * * NOTE: this should be set BEFORE any of the play methods are called. * * @param audioBufferCapacityMs the capacity of the buffer in milliseconds */ public void setAudioBufferCapacityMs( int audioBufferCapacityMs ) { this.audioBufferCapacityMs = audioBufferCapacityMs; } 

我会发布我如何做到这一点,锄头它有所作为。 它不是一个实时的声音项目(这是一个来自在线API的MP3,但大约4-6mb),所以它可能会有所不同,但需要不到3-5秒加载我的genimotion虚拟机。

我知道它和你的代码几乎一样。 也许如果你可以分享的url或类似的给出相同的问题,我可以在我的应用程序中testing它。

 runThread(url);//ran on the oncreate. private void runThread(final String url) { new Thread() { public void run() { mediaPlayer = new MediaPlayer();//mediaplayer is a global variable. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try{ mediaPlayer.setDataSource(url); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { //audio did finish. } }); mediaPlayer.prepare(); // might take long! (for buffering, etc) duration = mediaPlayer.getDuration(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { runOnUiThread(new Runnable() { @Override public void run() { //here you should start playing it. } }); } }); } catch(Exception e) { } } }.start(); } 

在与果冻豆的联结4上testing,类似的时间响应。

如果你愿意在图书馆上花一些钱,我推荐Bass它有一套完整的API调用,你可以整合,也是一个可靠的文档。 有一个共享软件版本,你可以testing。

如果你不愿意花$。 我强烈推荐VLC @Kai提到,在将来你也可以将你的应用扩展到videostream。 我之前使用API​​来为我的水族馆执行实时stream。 @凯给你提供了必要的链接。

看看这个链接了解更多信息。