在android 2.3上通过HTTPS播放.m3u8文件

在我的代码中的某个时刻,应用程序会找到一个指向.m3u8文件的URL.接下来会发生这种情况:

mVideoView.setVideoURI(Uri.parse(feed.getUrl().toString())); // feed.getUrl returns the url
mVideoView.start();

它在Android 3.1上运行FINE.不是早期版本,因为它使用https(参见:http://developer.android.com/guide/appendix/media-formats.html)

所以我做的是为Android 2.2创建了一个新版本的应用程序,它使用了vitamio,这个库应该让我更容易.但是,在哪里(android.widget.VideoView)完美地处理它,(io.vov.vitamio.widget.VideoView)需要很长时间来加载流并最终在崩溃时说这个:

但是,当我尝试加载此URL时:http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
它工作正常!

我无法共享我需要使用的URL,但这里指的是.m3u8的内容:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=264000
playlist.m3u8?session=003016302664236&index=0
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1364000
playlist.m3u8?session=003016302664236&index=1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=44000
playlist.m3u8?session=003016302664236&index=2

所以我在这个和Apple样本之间可以看到的主要区别是,我正在使用https,我的文件指向其他.m3u8文件(而Apple的.m3u8指向.ts文件).
两者似乎都使用AAC音频.

这个问题似乎与维生素有关.我怎样才能解决这次崩溃?非常感谢你.

解决方法:

我找到了解决方案!

所以我要说的第一件事是我很困惑,而且我没有使用HTTPS,但我的解决方案也适用于https.

首先,您可能需要像我一样使用Vitamio,因为Gingerbread不支持直播(再次阅读this).现在的问题是,如果您的M3u8文件是.ts文件列表,它应该可以正常工作.但如果它指向其他m3u8文件..

那么你必须自己解析它.你可以这样做,例如:

url = new URL(livetvchannel.getUrl());
InputStream M3U8 = (InputStream) url.getContent();      
BufferedReader br = new BufferedReader(new InputStreamReader(M3U8));
for(int i = 0; i < 2; ++i)
    br.readLine();
String target = br.readLine(); //this parses the third line of the playlist
br.close();
url = new URL(baseURL.concat(target)); 
//if the m3u8 url is relative, you have to concat it with the path
//Note: You have to do all this in a thread, you can't do network on UiThread


mVideoView.setVideoURI(Uri.parse(url.toString())); //Run this on UiThread

url将指向视频流.你去吧!最后不是那么难.

上一篇:(转) 国内电(视)台直播源地址


下一篇:Android视频流mms和m3u8