4

在我的代码中,应用程序找到了一个指向 .m3u8 文件的 URL。这就是接下来会发生的事情:

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

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

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

加载 .m3u8 时记录

但是,当我尝试加载此 URL 时: http: //devimages.apple.com/iphone/samples/bibpbop/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

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

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

4

1 回答 1

4

我找到了解决办法!

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

首先,您可能需要像我一样使用 Vitamio,因为 Gingerbread 不支持直播(再次阅读内容)。现在的问题是,如果您的 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 将指向视频流。你去吧!最后也没那么难。:)

于 2013-02-14T04:29:51.583 回答