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

时间:2013-02-09 01:19:54

标签: android video https m3u8

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

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)需要很长时间来加载流并最终在崩溃时这样说:

Log when loading the .m3u8

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

我无法共享我需要使用的网址,但这里指的是.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音频。

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

1 个答案:

答案 0 :(得分:4)

我找到了解决方案!

所以我要说的第一件事是我很困惑,而且我没有使用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将指向视频流。你去吧!最后不是那么难。 :)