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

2023-12-04

在我的代码中的某个时刻,应用程序发现一个指向 .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) 需要很长时间来加载流并最终在崩溃时说这个:

Log when loading the .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

因此,我可以看到这个示例与 Apple 示例之间的主要区别是我使用 https,我的文件指向其他 .m3u8 文件(而 Apple 的 .m3u8 指向 .ts 文件)。 两者似乎都使用 AAC 音频。

这个问题似乎与vitamio有关。我怎样才能避免这次崩溃?非常感谢。


我找到了解决方案!

所以我首先要说的是我很困惑,我没有使用 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 将指向视频流。就这样吧!最后并没有那么难。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android 2.3上通过HTTPS播放.m3u8文件 的相关文章

随机推荐

  • JList 和 ArrayList 更新

    我想要一个有关如何在从 ArrayList 添加或删除元素时更新 JList 的示例 ArrayList 是 Model 类的一部分 Model 类通过其构造函数传递到视图 这是一个包含多个 swing 组件的 JPanel 和我想要更新的
  • 增强图列表或向量

    我已经花了好几天的时间来使用 boost 图形库 据我了解 在考虑 VertexList 和 EdgeList 存储时 vecS 拥有索引 因此可以通过它进行访问 删除顶点时 迭代器失效 listS no index 不会使迭代器无效 虽然
  • 如何在 Python / NumPy 中有效生成所有凸组合(意味着它们的总和为 1.0)?

    我需要生成所有值总和为 1 0 的 3 维数组 即它们是凸组合 假设每个元素可以是以下之一 0 0 0 2 0 4 0 6 0 8 1 0 因此 像这样的组合 0 0 0 4 0 6 or 0 2 0 6 0 2 是正确的 因为它们的总和为
  • 用于传递哈希值的独特构造

    我从未见过这种用于构建哈希的结构 do stuff records records 这仅适用于发送到方法的参数列表吗 它在任何地方都有记录吗 我知道它是 Ruby 1 9 records example com gt 1 2 3 4 hel
  • Windows API:通过C#处理外部窗口应用程序的按键事件

    我打开了一个外部应用程序窗口 通过我的 winform 应用程序 我想在这个外部窗口上发生按键事件时执行某些代码 我知道这个外部应用程序窗口的窗口句柄 任何帮助将不胜感激 Thanks 一种方法是在外部应用程序窗口上设置一个钩子设置Wind
  • _oDialog.destroy() 之后出现“setInitialFocusId”错误

    调用后再次尝试打开对话框片段时出现以下错误this oDialog destroy 未捕获的类型错误 无法读取 null 的属性 setInitialFocusId 我的问题就像这里所说的问题 关闭后如何清除dialog xmlfragme
  • 在 R 中将一列分成两部分,中间留有空格

    我有一个数据框 其前 20 个 obs 如下所示 userID appName startTime endTime endResult Handset Gender Age Telecom 1 007qkrtk com kakao talk
  • 为什么在 C++ 类成员函数中使用关键字“const”两次

    我一直在类中运行函数定义 如下所示 Accessor function const string getName const return name 我的问题是 为什么 const 这个词出现两次 我知道定义末尾的 const 有助于保护原
  • 忽略 JWT 中的签名

    我有一个使用 OpenId Connect 的 Web 应用程序 我创建了一个自签名证书 但它仍未由 CA 签名 如何忽略签名验证 这是我到目前为止所拥有的 SecurityToken validatedToken null var tok
  • 在 x86_64 上添加 i2c 客户端设备

    在我的 x86 64 板上 有来自 MFD 设备的 i2c 总线 此 i2c 总线上有设备 我能够使用 i2cDetect 程序检测这些设备 i2cdetect y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00
  • 如何从用户处获取一个号码

    我刚刚学习 C 到目前为止 我一直在使用 javascript 和 php 等语言 但我很难将我的一些思维步骤转换为 C 的可能性 我正在编写的程序 听起来比实际要大 使用输入菜单让用户选择一个选项 选项可以是 1 2 或 3 现在 我正在
  • 使用批处理代码批量进行 xml 格式化?

    我有一个包含 50 个子文件夹的文件夹 每个子文件夹包含 2 个 xml 文件 O DATA xml S DATA xml 由于它们在记事本中出现在一行中 因此我必须修复格式 我从类似的问题中找到了这段代码 echo off setloca
  • python 异步特殊类方法 __delete__

    海峡到点 我怎么能够async def特殊类方法 例如 delete 在Python中 为什么我需要这个 为了实现在多个进程之间共享的良好缓存系统 我想从数据库中检索一次数据并将它们存储在缓存中 修改缓存中的数据 当不再使用数据时 更新数据
  • swing 中的 EDT 更新是绝对规则还是有例外?

    在 Swing 中 GUI 应该仅由 EDT 更新 因为 GUI 组件不是线程安全的 我的问题是 如果我有一个除 EDT 之外的线程 专用于更新特定组件 并且该组件不被程序中的任何其他线程访问 只有这个专用线程访问 可以吗 就我而言 我有一
  • Tensorflow,如何将 2D 张量(矩阵)乘以 1D 向量中的相应元素

    我有一个二维矩阵M形状的 batch x dim 我有一个向量V形状的 batch 如何将矩阵中的每一列乘以 V 中的相应元素 那是 我知道一个低效的 numpy 实现将如下所示 import numpy as np M np random
  • Java:哪个更快?局部变量还是访问封装?

    我最近读了一篇StackOverflow问题这表明 访问变量时 使用堆栈比使用堆更快 void f int x 123 lt located in stack int x lt located in heap void f x 123 但是
  • 如何在 swift 闭包中抛出错误?

    请看下面的代码 override func tableView tableView UITableView editActionsForRowAtIndexPath indexPath NSIndexPath gt UITableViewR
  • 打印 PHP 调用堆栈

    我正在寻找一种在 PHP 中打印调用堆栈的方法 如果该函数刷新 IO 缓冲区 则会获得奖励点 比以下内容更具可读性debug backtrace e new Exception var dump e gt getTraceAsString
  • get 请求在 Node.JS 和 Express 中不起作用

    我的 app get 没有运行 我不知道为什么 我也尝试过使用 作为路线 但我无法返回任何内容 我已经发布了下面的代码 const express require express const morgan require morgan co
  • 在android 2.3上通过HTTPS播放.m3u8文件

    在我的代码中的某个时刻 应用程序发现一个指向 m3u8 文件的 URL 这就是接下来发生的事情 mVideoView setVideoURI Uri parse feed getUrl toString feed getUrl return