Android 3.x / HLS如何在流结束时启动

时间:2012-02-09 16:40:14

标签: android video-streaming android-3.0-honeycomb http-live-streaming

我正在使用以下代码播放HLS流:

mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("http://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_all.m3u8");
mediaPlayer.setDisplay(holder);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnVideoSizeChangedListener(this);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();

使用此代码,根据播放到VLC中的相同流,我在视频中看到的内容大约晚了5分钟。

播放器开始播放.m3u8文件的第一个块。 但是hls规范确定第一个块是较旧的,最后一个是最新的。所以玩家应该开始播放文件的最后一块。

我怀疑与setDataSource方法的参数有关,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题 - 看起来在Android上启动实时HLS提要(没有EXT-X-ENDLIST标记)时,核心HLS解析组件中的错误无法启动实时点(Feed的结尾),而是从流的开头开始。

code.google.com上有一个关于此问题的错误 - 您可以在其中“加注星标”或在其中投票:

http://code.google.com/p/android/issues/detail?id=37156

答案 1 :(得分:1)

我不相信HLS规范没有明确说明要开始的段,但通常是从现场hls的第三个段开始。

您所指的流是视频点播(VOD)HLS来源。唯一的区别是播放列表使用#EXT-X-ENDLIST终止。导致:

  • 播放器未刷新播放列表
  • 从第一块开始。
$ curl http://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_700.m3u8
...
#EXTINF:10,
http://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_700/Seg_060110_103747_44/nasatv_700_060110_103747_87966.ts
#EXTINF:0,
http://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_700/Seg_060110_103747_44/nasatv_700_060110_103747_87967.ts
#EXT-X-ENDLIST

看看Envivio页面,我相信他们有一些你可以测试的实时HLS频道。

一般性评论:在测试HLS方面,不要依赖VLC。