Android如何离线播放加密(HLS)m3u8视频——实现HLS缓存

2023-11-15

HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。

它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。
m3u8,是HTTP Live Streaming直播的索引文件。m3u8基本上可以认为就是.m3u格式文件,区别在于,m3u8文件使用UTF-8字符编码。
#EXTM3U                     m3u文件头,必须放在第一行
#EXT-X-MEDIA-SEQUENCE       第一个TS分片的序列号
#EXT-X-TARGETDURATION       每个分片TS的最大的时长
#EXT-X-ALLOW-CACHE          是否允许cache
#EXT-X-ENDLIST              m3u8文件结束符
#EXTINF                     extra info,分片TS的信息,如时长,带宽等

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0xe532855feb3e18366b8e7ea0c11f3116
#EXTINF:10.066667,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg0
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x48586a2ac8397fbce9565480259c1b94
#EXTINF:10.000000,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg1
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x928f18982f6ee1a7e36cfa8f36979c3a
#EXTINF:10.000000,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg2
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x6651941d56de8af0c7d4bee9ae33a8de
#EXTINF:10.000000,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg3
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x90df003d61ba2ef9413fdaf521cfce15
#EXTINF:10.000000,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg4
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0xc7773183806b8d3d7e44811076ed5b66
#EXTINF:2.200000,
http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg5
#EXT-X-ENDLIST
hls加密是利用AES-128位对每个ts文件进行加密,播放器在取得PlayList文件的时候,会根据里面的#EXT-X-KEY标签请求获得解密的URL,再请求解密密钥,之后会用密钥对获取的ts文件解密。
实例中 http://ztest.qiniudn.com/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg5 是一个加密的ts片段,也就是视频切割分片中的一段。

上面简单介绍了一下HLS视频的构成,其实实现HLS的离线缓存播放,就是在理解HLS的播放原理的基础上,在Android本地建立HLS的播放环境,重建m3u8文件。大体上可以分为以下几步:
一、根据播放地址下载m3u8文件
二、解析m3u8文件,提取文件中的片段地址、片段时间长度、解密URL等信息
三、根据上面提取的片段地址按顺序依次下载到sdcard,同一个视频的多个片段下载到同一个文件夹中,并保持规则的文件名,例如0001.ts,0002.ts等
四、根据解密URL,获取加密使用的AES-128位的秘钥,为了安全考虑,可以将秘钥加密后保持到本地,然后本地的http服务在请求是将加密的秘钥解密返回给播放器
五、重新构造本地缓存的m3u8文件,将片段地址替换为本地http服务的地址,将加密key的地址替换为本地服务的地址,其它的原封不动的恢复,可以参见下面的转换后m3u8
六、在本地建立http file server代理本地保存的片段文件,m3u8文件,加密key文件
七、hls播放器的播放链接地址替换为本地的m3u8文件地址就可以
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:11
#EXT-X-KEY:METHOD=AES-128,URI="http://127.0.0.1:8888/crypt0.key",IV=0xe532855feb3e18366b8e7ea0c11f3116
#EXTINF:10.066667,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg0
#EXT-X-KEY:METHOD=AES-128,URI="http://127.0.0.1:8888/crypt0.key",IV=0x48586a2ac8397fbce9565480259c1b94
#EXTINF:10.000000,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg1
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x928f18982f6ee1a7e36cfa8f36979c3a
#EXTINF:10.000000,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg2
#EXT-X-KEY:METHOD=AES-128,URI="http://127.0.0.1:8888/crypt0.key",IV=0x6651941d56de8af0c7d4bee9ae33a8de
#EXTINF:10.000000,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg3
#EXT-X-KEY:METHOD=AES-128,URI="http://ztest.qiniudn.com/crypt0.key",IV=0x90df003d61ba2ef9413fdaf521cfce15
#EXTINF:10.000000,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg4
#EXT-X-KEY:METHOD=AES-128,URI="http://127.0.0.1:8888/crypt0.key",IV=0xc7773183806b8d3d7e44811076ed5b66
#EXTINF:2.200000,
http://127.0.0.1:8888/Fr88-3sZu8HqPFot_BapyYtuz3k=/FgCBc3IlydY6CFIA8jhe7jIxCt1y/seg5
#EXT-X-ENDLIST
综上所述基本就可以完成hls视频的本地缓存播放,整体看起来步骤还是比较复杂的,祝好运。

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

Android如何离线播放加密(HLS)m3u8视频——实现HLS缓存 的相关文章

  • EF循环依赖

    1 项目场景 项目场景 1 本项目采用了EF架构来建立实体与实体之间的关联关系 2 一个部门对应多个摄像头 1 部门实体 public partial class DepartmentEntity 部门实体 public int Id ge
  • 别光看NB的Github开源项目,你得参考他们去设计自己的架构!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 背景引入 首先简单介绍一下项目背景 公司对合作商家提供一个付费级产品 这个商业产品背后涉及到数百人的研发团队协作开发 包括各种业务系统来提供很多强大的业务功能 同
  • API架构的选择,RESTful、GraphQL还是gRPC

    文章目录 一 RESTful 1 什么是RESTful 2 RESTful架构的原则 3 RESTful的适用场景 4 RESTful的优点 5 RESTful的缺点 二 GraphQL 1 什么是GraphQL 2 GraphQL的原则
  • 数据仓库进阶 《阿里大数据之路》第二篇 数据模型篇 (完整版)

    第8章 大数据领域建模综述 此文章为学习笔记 有兴趣的小伙伴可以根据以下指引获取更多 学习内容链接如下 视频 一起啃书 阿里大数据之路数据仓库建模基础理论研读 已完结 哔哩哔哩 bilibili 书籍 阿里大数据之路 8 1 为什么需要数据
  • 英伟达最新开源

    Title FasterViT Fast Vision Transformers with Hierarchical Attention Paper https arxiv org pdf 2306 06189 pdf Code https
  • 12_Linux ARM架构_安装JDK8-银河麒麟V10(Kylin Linux Advanced Server V10 )操作系统

    12 Linux ARM架构 安装JDK8 银河麒麟V10 Kylin Linux Advanced Server V10 操作系统 1 官网下载aarch64架构jdk包 2 linux服务器中创建java文件夹 方便后期快速寻找 3 将
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • RabbitMQ集群架构模式

    搭建Mirror镜像集群 4369是erlang的发现端口 5672是rabbitmq的通信端口 15672是rabbitmq的可视化控制台的端口号 25672是erlang底层发送消息和分配消息的底层端口 firewall cmd zon
  • Keycloak概述

    这里写自定义目录标题 Keycloak概述 Single Sign On Kerberos 社交登录 用户合并 客户端适配 管理控制台 用户管理控制台 标准协议 授权服务 Getting Started Keycloak概述 keycloa
  • 如何使用 FFmpeg 生成多分辨率 HLS 进行直播 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 请注意 SRS 支持为特定分辨率生成单独的 m3u8 文件 SRS 是否还支持为多种分辨率和比特率场景生成额外的主 m3u8 文件 所需的母版 m3u8 示例 EXTM3U EXT
  • 在android 2.3上通过HTTPS播放.m3u8文件

    在我的代码中的某个时刻 应用程序发现一个指向 m3u8 文件的 URL 这就是接下来发生的事情 mVideoView setVideoURI Uri parse feed getUrl toString feed getUrl return
  • 【CPU 架构】x86、x86_64、x64、arm64、aarch64

    x86 x86 64 x64 arm64 aarch64 1 服务器分类 2 CPU 架构 2 1 x86 架构 x86 x86 64 x64 2 2 arm 架构 arm64 和 aarch64 3 发展历史 1 服务器分类 按照 CPU
  • AVPlayer 播放 m3u8 流时如何捕获图像?

    I use AVPlayer玩一个m3u8文件 我想在这些代码中捕获图像 AVAssetImageGenerator gen AVAssetImageGenerator alloc initWithAsset self player cur
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • 从0开始,做一个后台项目的架构

    作为一名架构师 老板要求你把公司的后端技术栈搞一下 那你该如何去做呢 对我而言我 我的答案是综合考虑下面的这些内容然后进行决定 团队协助基础工具链的选型和培训 搭建微服务开发基础设施 选择合适的RPC框架 选择和搭建高可用的注册中心 选择和
  • 第六章--- 实现微服务:匹配系统(下)

    0 写在前面 这一章终于完了 但是收尾工作真的好难呀QAQ 可能是我初学的缘故 有些JAVA方面的特性不是很清楚 只能依葫芦画瓢地模仿着用 特别是JAVA的注解 感觉好多但又不是很懂其中的原理 只知道要在某个时候用某个注解 我真是有够菜的
  • 实现基于 Keepalived 和 Nginx 的高可用架构

    目录 前言 1 高可用性简介 2 准备服务器和软件 3 高可用的配置 主从配置 3 1 配置 etc keepalived keepalived conf文件 3 2 配置 usr local src nginx check sh脚本文件
  • 如何使用 ffmpeg 批量/顺序下载 m3u8 文件?

    我目前在 Mac 上使用以下命令单独下载 m38u 播放列表 ffmpeg i lt URL with m3u8 gt codec copy output ts 如果我想处理多个文件 我目前可以通过单独的终端窗口进行操作 我想做的是 在一个
  • 专车数据层架构进化往事:好的架构是进化来的,不是设计来的

    很多年前 读了 子柳 老师的 淘宝技术这十年 这本书成为了我的架构启蒙书 书中的一句话像种子一样深埋在我的脑海里 好的架构是进化来的 不是设计来的 2015 年 我加入神州专车订单研发团队 亲历了专车数据层 架构进化 的过程 这次工作经历对
  • 从 .ts 文件动态生成 .m3u8

    我有一个遵循此模式的 ts 文件段列表 http www someaddress com file 11223344 ts http www someaddress com file 11223345 ts http www someadd

随机推荐

  • 2020年度 个人随笔

    2020年的年度总结其实很好写 for index in 0 2 Log 我太难了 Log 完 2020年这么难 哪里还有心情写总结 回归正题 总结还是要写的 毕竟人老了就爱回忆 就让往事随风 往事随风 随风 风 前言 马上就是2021年了
  • FISCO BCOS JAVA SDK(以HelloWorld合约为例)

    FISCO BCOS JAVA SDK 环境搭建 文章目录 FISCO BCOS JAVA SDK 环境搭建 前言 一 环境准备 1 开发工具 2 开发环境 二 开发步骤 1 创建一个Gradle应用 2 引入Java SDK 3 配置SD
  • 第十届“泰迪杯”B题论文及代码

    正在为您运送作品详情 点击以上链接即可 想看思路可看我另一篇博客
  • c++ 解析.csv文件(全)

    c 解析csv文件 一 项目要求 1 这个程序需要做到将csv文件的内容读取进来解析 并将每一个联系人的数据进行打印 2 用户输入排序的属性key 将排序完成的结果打印出来 3 能够对错误格式的文件进行检测 4 能够对错误的数据进行容错 5
  • leftPush和rightPush区别

    redis对list操作分为左和右两种 redisTemplate opsForList leftPush 实际调用的是lPush return connection lPush rawKey new byte rawValue redis
  • CSDN-如何修改字体的大小和颜色呢

    CSDN 如何修改字体的大小和颜色呢 CSDN markdown编辑器是其衍生版本 扩展了Markdown的功能 如表格 脚注 内嵌HTML等等 Size 规定文本的尺寸大小 可能的值 从 1 到 7 的数字 浏览器默认值是 3 一 模板
  • coverage es6覆盖率解决方法

    该文章整理于2017年 当时为解决在GridManager2 3 0版本中ES6替换时遇到的问题 原文如下 替换之后发现 原先的测试覆盖率从72 下降至 24 通过 coverage html 在本地测试后发现 覆盖目标文件使用的为 bab
  • IDEA全局替换

    替换 有全局替换 和 当前文件内容替换 全局 ctrl shift r 在路径中替换 指的是在选定的目录下或者类包下 查找要被替换的字符 当前文件内容 ctrl r 当前文件内容替换 指的是在当前打开的文件中替换匹配的字符 只操作一个文件
  • 用python画二元函数图像

    利用Python的Matplotlib库可以实现二元函数的可视化 以下以一段代码说明 第三方库需求 Matplotlib 数据可视化 numpy 数学计算库 代码 import matplotlib pyplot as plt import
  • 控制反转 的种类

    之前对控制反转的定义和解释都不是很清晰 最近翻书发现在 Pro Spring 5 免费电子版在文章最后 有一段非常不错的解释 记录一下 有道翻译贴出来方便查看 如有请直接跳过中文 看后面的原文 控制反转的类型 控制反转的类型您可能想知道为什
  • CMake:消灭error(一)

    使用CMake 遇到的第一个错误 CMake Error CMake can not determine linker language for target hello CMake Error Cannot determine link
  • 微信小程序 首页弹出用户协议

    话不多说 直接上代码 wxml
  • 经典神经网络总结

    1 LeNet 5 3层卷积 2层全连接 第一个CNN网络 由 L e C u n LeCun LeCun提出 用于手写数字识别 1 1 网络结构 1 2 各层参数详解 0 INPUT层 输入层 输入图像
  • Python 自动发送邮件实战案例,人人都可以学会

    自动发送邮件能应用于许多场景 比如我想要知道股票策略中的股票池是否有实时的更新 这时候如果再拉一遍数据 跑一遍脚本 实在是太浪费时间了 为什么不把这一套流程放到服务器上 然后到点自动运行并发送邮件呢 类似的应用场景还有很多 不仅仅是在股票策
  • Android系统启动流程

    Android系统启动流程学习 会对Android系统与Linux系统的关系有一个更深的理解 Android启动流程 Android启动时序图 Linux启动 开机过电 复位器件 执行Bootloader程序 arm中是uboot或者fas
  • 经历一些事,认清一些人

    你发现了吗 随着年龄的增长 我们身边的朋友没有变多 反而越来越少了 这是我们的交友能力逐渐在下滑吗 其实不然 这是因为随着经历的事情多了 我们具备了认清别人的能力 能够分辨哪些是生命中的过客 哪些是值得珍惜的挚友 1 高分美剧 后翼弃兵 中
  • 3D游戏设计——AR/MR技术

    HW12 AR小游戏设计 本次AR小游戏并没有给出什么要求 由于大作业实在太多了 所以这篇博客重点在于怎么配置环境 并实现图片识别的功能 虚拟按键的玩法暂时没有想到什么好的点子 会在之后比较有空时详细设计 并补充完整 求TA手下留情 配置环
  • Bootstrap4 模态对话框示例

  • Java中"abc" instanceof Object返回结果

    返回结果 true instanceof 是Java的一个二元操作符 和 gt lt 是同一类的比较运算符 因为它由字母组成的 所以也是Java的关键保留字 它的作用是测试它左边的对象是否是它右边类的实例 返回boolean类型数据 abc
  • Android如何离线播放加密(HLS)m3u8视频——实现HLS缓存

    HTTP Live Streaming HLS 是苹果公司 Apple Inc 实现的基于HTTP的流媒体传输协议 可实现流媒体的直播和点播 主要应用在iOS系统 为iOS设备 如iPhone iPad 提供音视频直播和点播方案 它的工作原