.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

相关文章

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

MySQL索引失效问题及解决方案

《MySQL索引失效问题及解决方案》:本文主要介绍MySQL索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql索引失效一、概要二、常见的导致MpythonySQL索引失效的原因三、如何诊断MySQL索引失效四、如何解决MySQL索引失

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优