.m3u8播放列表文件(索引格式文件)、HLS(HTTP Live Streaming)协议介绍

本文主要是介绍.m3u8播放列表文件(索引格式文件)、HLS(HTTP Live Streaming)协议介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

M3U8文件格式是为了支持HLS(HTTP Live Streaming)协议而开发的。HLS是Apple公司设计的一种基于HTTP的流媒体传输协议,用于传输音频和视频数据。

在HLS中,媒体内容被切分为一系列的小片段,每个片段都有自己的URL。这些URL存储在一个M3U8播放列表文件中。当客户端设备播放HLS流时,它会根据M3U8文件中的信息下载并连续播放各个媒体片段,从而实现无缝流媒体播放。

因此,可以说M3U8文件格式是为了满足HLS技术的需要而设计的。然而,由于M3U8本质上只是一种索引文件格式,它也可以被用在其他的场景中,例如用来创建音频或视频的播放列表。

但在大多数情况下,当我们谈论M3U8时,我们通常是在讨论与HLS相关的应用。

文章目录

  • M3U8 介绍
    • HLS与M3U8概念
      • HLS(HTTP Live Streaming)
      • M3U8
    • M3U8 结构
      • 文件头
      • 媒体段信息
      • 媒体段 URI
    • M3U8 文件常见字段和参数解释
      • 1. `#EXTM3U`:M3U8文件的头部标识,表示这是一个M3U8文件。
      • 2. `#EXT-X-VERSION`:该标签表明播放列表兼容的协议版本。例如:#EXT-X-VERSION:3
      • 3. `#EXT-X-MEDIA-SEQUENCE`:表示媒体文件URI列表的开始序号。例如:#EXT-X-MEDIA-SEQUENCE:7794
      • 4. `#EXT-X-TARGETDURATION`:所有媒体文件最大的时长(秒)。例如:#EXT-X-TARGETDURATION:10
      • 5. `#EXTINF`:媒体段文件的时长(秒),紧接着这个标签的下一行是对应的媒体文件URI。例如:fileSequence0.ts,
      • 6. `#EXT-X-ENDLIST`: 播放列表结束标记,表示所有的媒体文件已经列出。
      • 7. `#EXT-X-STREAM-INF`: 用于定义流的参数,例如带宽、分辨率等。
      • 8. `#EXT-X-DISCONTINUITY`: 在两个媒体文件之间插入此标签,表示这两个媒体文件之间可能存在不连续的情况,比如编码参数的改变、时间戳的跳跃等。
      • 9. `#EXT-X-KEY`: 定义了解密媒体段所需要的方法和密钥。这用于对流进行加密。
      • 10. `#EXT-X-MAP`: 指定了一个包含媒体初始化片段的URI。
      • 11. `#EXT-X-ALLOW-CACHE`:一个可选的标签,表示是否允许客户端缓存媒体段文件
    • M3U8 技术解析
      • 文件格式
      • 切片技术
      • 编码和解码
    • M3U8 应用案例
    • 实例
      • MP4 转 m3u8
    • 其他问题
      • 直播场景下,m3u8文件的更新时机(注意:ffmpeg更新m3u8文件通常是原子的,不用担心在读取的时候读取到部分或者不完整的数据)

M3U8 介绍

M3U8 是一种基于 HTTP Live Streaming (HLS) 技术的媒体播放列表格式。这是一个非常重要的技术,因为它使得流媒体内容能够适应不同的网络状况和设备能力,从而实现无缝的在线视频体验。

HLS与M3U8概念

HLS(HTTP Live Streaming)

HLS 是由 Apple Inc. 提出的一个用于实时流和点播系统的协议。这个协议可以把流媒体文件切分成多个小片段,然后通过 HTTP 协议进行传输。这样做的好处是,播放器可以根据网络状况动态选择不同质量的流,从而避免缓冲或者卡顿。

M3U8

M3U8 是 UTF-8 编码的 M3U 文件。M3U 是一种简单的音频播放列表格式,主要用于 MP3 列表。在 HLS 中,M3U8 用于描述媒体流的信息,比如分段的位置、时长、序列号等。

M3U8 结构

一个 M3U8 文件通常包含以下几个部分:

文件头

#EXTM3U 开始,表示这是一个 M3U8 文件。

媒体段信息

#EXTINF 开始,后面跟着该媒体段的时长和标题。

媒体段 URI

指向媒体文件(通常是 .ts 文件)的路径或者 URL。

M3U8 文件常见字段和参数解释

1. #EXTM3U:M3U8文件的头部标识,表示这是一个M3U8文件。

2. #EXT-X-VERSION:该标签表明播放列表兼容的协议版本。例如:#EXT-X-VERSION:3

3. #EXT-X-MEDIA-SEQUENCE:表示媒体文件URI列表的开始序号。例如:#EXT-X-MEDIA-SEQUENCE:7794

4. #EXT-X-TARGETDURATION:所有媒体文件最大的时长(秒)。例如:#EXT-X-TARGETDURATION:10

5. #EXTINF:媒体段文件的时长(秒),紧接着这个标签的下一行是对应的媒体文件URI。例如:fileSequence0.ts,

6. #EXT-X-ENDLIST: 播放列表结束标记,表示所有的媒体文件已经列出。

7. #EXT-X-STREAM-INF: 用于定义流的参数,例如带宽、分辨率等。

8. #EXT-X-DISCONTINUITY: 在两个媒体文件之间插入此标签,表示这两个媒体文件之间可能存在不连续的情况,比如编码参数的改变、时间戳的跳跃等。

9. #EXT-X-KEY: 定义了解密媒体段所需要的方法和密钥。这用于对流进行加密。

10. #EXT-X-MAP: 指定了一个包含媒体初始化片段的URI。

11. #EXT-X-ALLOW-CACHE:一个可选的标签,表示是否允许客户端缓存媒体段文件

它有两个值:

  1. YES:允许客户端缓存媒体段。
  2. NO:不允许客户端缓存媒体段。

例如:#EXT-X-ALLOW-CACHE:YES

需要注意的是,在最新版的HLS协议中,这个标签已经被废弃,因为其在实际中的效果并不明确,决定是否缓存通常由客户端自身或者HTTP的缓存控制机制来决定。

注意:"客户端缓存媒体段"是指在客户端(例如,你的手机或电脑上的媒体播放器)暂时存储媒体流中的一部分数据,以便在网络连接出现问题时仍能继续播放。

当你在线观看视频或听音乐时,数据通常不是一次性从服务器传输到你的设备的。相反,它被切割成一小段一小段的,这些小段被称为"媒体段"或"媒体片段"。这种技术被称为流媒体,因为数据就像流水一样连续地流向你的设备。

当客户端允许缓存媒体段时,它会把每个媒体段保存在本地存储中,直到它们被播放。然后,即使网络连接暂时中断,播放器也可以继续从本地缓存播放,从而为用户提供更流畅的播放体验。

M3U8 技术解析

文件格式

M3U8 文件本质上是一个文本文件,其中包含了播放流媒体所需要的所有信息。比如:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
fileSequence0.ts
#EXTINF:9.009,
fileSequence1.ts
#EXTINF:3.003,
fileSequence2.ts
#EXT-X-ENDLIST

这个例子中的 M3U8 文件描述了三个 .ts 文件,每个文件的时长分别是 9.009 秒、9.009 秒和 3.003 秒。

切片技术

在 HLS 中,媒体流被切分成多个小片段,这些片段通过 M3U8 文件进行管理。切片技术有以下几个好处:

  • 能够根据网络状况动态调整流的质量,提高播放体验。
  • 支持实时流和点播内容。
  • 可以适应各种网络环境,包括移动网络。

切片技术的主要挑战是如何保持视频的连续性和同步性。为了解决这个问题,HLS 使用了时间戳和序列号等机制。

编码和解码

在 HLS 中,媒体流通常被编码为 MPEG-2 Transport Stream (TS) 格式。这是一个非常成熟的格式,可以支持多种音频和视频编码,包括 H.264、AAC 等。

对于播放器来说,需要能够解析 M3U8 文件,并且解码 TS 流。这通常通过一些库(比如 FFmpeg)或者系统级别的支持(比如 iOS 的 AVPlayer)来实现。

M3U8 应用案例

M3U8 在许多流媒体应用中都有广泛的应用,比如 YouTube、Netflix、Hulu 等。在这些应用中,M3U8 用于管理和播放各种质量的流,从而提供优质的播放体验。

实例

MP4 转 m3u8

以下文章中有一个 ffmpeg 将 MP4 文件转换成 m3u8 文件的实例:

Docker nginx容器代理播放m3u8视频文件(HLS)

其他问题

直播场景下,m3u8文件的更新时机(注意:ffmpeg更新m3u8文件通常是原子的,不用担心在读取的时候读取到部分或者不完整的数据)

在直播场景下,当新的TS文件(HLS流的一个分段)生成时,M3U8文件(播放列表)通常会被更新。每当有新的TS文件生成并准备好供客户端下载时,就会将其信息添加到M3U8文件中。

具体来说,这个过程大致如下:

  1. 新的TS文件生成。
  2. TS文件的信息(包括其URL、持续时间等)被添加到M3U8文件中。
  3. 如果启用了滚动窗口策略(即 -hls_list_size 参数),并且当前TS文件数量超过了设置的值,那么最旧的TS文件信息会从M3U8文件中移除。

此外,FFmpeg还支持通过 hls_flags 参数进行更细粒度的控制。例如,可以设置 append_list 标志以在现有列表而不是新列表中添加新的TS文件。

‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍
ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ

这篇关于.m3u8播放列表文件(索引格式文件)、HLS(HTTP Live Streaming)协议介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/579898

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G