.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文件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/298588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniappVue3版本中组件生命周期和页面生命周期的详细介绍

一、什么是生命周期? 生命周期有多重叫法,有叫生命周期函数的,也有叫生命周期钩子的,还有钩子函数的,其实都是代表,在 Vue 实例创建、更新和销毁的不同阶段触发的一组钩子函数,这些生命周期函数…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x00-11x11(总结)

如上表73所示,主输出使能(MOE0)的8种OCx与OCxN的输出状态及波形图,已经单独整理输出8篇文章,方便需要时单独回查。 根据表73可得以下结论 1、从00x00~01x00的前5种状态的OCx与OCxN的引脚电平全由GPIO端口的上下拉决定…

Java序列化篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是java序列化,如何实现java序列化?二、保存(持久化)对象及其状态到内存或者磁盘三、序列化对象以字节数组保持-静态成员不保存四、序列化用户远程对象传输前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

1389 蓝桥杯 二分查找数组元素 简单

1389 蓝桥杯 二分查找数组元素 简单 //C风格解法1&#xff0c;lower_bound(),通过率100% //利用二分查找的方法在有序的数组中查找&#xff0c;左闭右开 #include <bits/stdc.h> using namespace std;int main(){int data[200];for(int i 0 ; i < 200 ; i) data[i] …

回首2023,期待2024!

2023&#xff0c;在改变中到来 2023年1月1日&#xff0c;我从成都冷清的学校回到了哈尔滨的老家&#xff0c;开始了保研之前的最后一个寒假 当时的目标是将之前的科研理论转化为实际&#xff0c;生产出一篇sci&#xff0c;助力保研加分 星移斗转&#xff0c;事与愿违&#x…

贯穿设计模式-责任链模式

样例代码 涉及到的项目样例代码均可以从https://github.com/WeiXiao-Hyy/Design-Patterns.git获取 需求 实时地&#xff0c;根据city&#xff0c;sex&#xff0c;product字段进行业务投放&#xff0c;比如&#xff1a;北京的男生&#xff1b;四川的电脑等等 → 责任链模式&…

React之useRef hook

介绍 useRef是react的自定义hook&#xff0c;它用来引用一个不需要渲染的值。这篇文章会介绍useRef的简单用法。 使用场景 1.实现节流 通过useRef实现节流功能&#xff0c;在限制时间内多次提交&#xff0c;已第一次提交为准。 useThrottle.jsx import {useEffect, useRef,…

【gRPC学习】使用go学习gRPC

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 RPC是远程调用,而google实现了grpc比较方便地实现了远程调用,gRPC是一个现代的开源远程过程调用(RPC)框架 概念介绍 在gRPC中&#xff0c;客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法&#…

Generator - JavaScript的异步颠覆者

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 什么是Generator 生成器函数的执行流程控制 异步编程应用 ✨ 结语 ✨ 前言 Java…

滑动窗口协议仿真(2024)

1.题目描述 滑动窗口协议以基于分组的数据传输协议为特征&#xff0c;该协议适用于在数据链路层以及传输层中对按 顺序传送分组的可靠性要求较高的环境。在长管道传输过程&#xff08;特别是无线环境&#xff09;中&#xff0c;相应的滑动窗口 协议可实现高效的重传恢复。附录 …

[Redis实战]分布式锁

四、分布式锁 4.1 基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xf…

浏览器的渲染流程

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

基于SpringBoot的MusiQ音乐网站

目录 前言 开发环境以及工具 项目功能 用户&#xff1a; 后台&#xff1a; 设计详情​编辑 登陆页面 后台管理页面 首页 视频展示 源码获取 前言 本项目是一个基于IDEA和Java语言开基于SpringBoot的MusiQ音乐网站。应用包含管理端&#xff0c;教师端&#xff0c;学生…

Spring见解 5 Spring整合MyBatis

6.Spring整合MyBatis 6.1.创建工程 6.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

YOLOv5改进 | 损失篇 | VarifocalLoss密集检测专用损失函数 (VFLoss,论文一比一复现)

一、本文介绍 本文给大家带来的是损失函数改进VFLoss损失函数,VFL是一种为密集目标检测器训练预测IoU-aware Classification Scores(IACS)的损失函数,我经过官方的版本将其集成在我们的YOLOv8的损失函数使用上,其中有很多使用的小细节(否则按照官方的版本使用根本拟合不了…

SpringBoot学习(六)-SpringBoot整合Shiro

12、Shiro 12.1概述 12.1.1简介 Apache Shiro是一个强大且易用的Java安全框架 可以完成身份验证、授权、密码和会话管理 Shiro 不仅可以用在 JavaSE 环境中&#xff0c;也可以用在 JavaEE 环境中 官网&#xff1a; http://shiro.apache.org/ 12.1.2 功能 Authentication…

开源加解密库之GmSSL

一、简介 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了对国密算法、标准和安全通信协议的全面功能覆盖&#xff0c;支持包括移动端在内的主流操作系统和处理器&#xff0c;支持密码钥匙、密码卡等典型国产密码硬件&#xff0c;提供功能丰富的命令行工具及…

精选顶级期刊中的三幅可复现图表

简介 最近在阅读文献时&#xff0c;发现了一些出色的可视化案例&#xff0c;特此与大家分享。这些图共同的特点是&#xff1a;1. 易懂明晰&#xff1b; 2. 信息丰富&#xff1b; 3. 配色优雅。 小编有话说&#xff1a;以下三幅图选自领域内顶级期刊&#xff0c;虽然并非采用R语…

K8S集群部署解决工作节点couldn‘t get current server API group list问题

最近在自己电脑上装了VMWare Player&#xff0c;在上面装了两个Ubuntu虚拟机&#xff0c;为了方便学习云原生技术&#xff0c;决定在上面装一个2个节点&#xff08;一个控制面&#xff0c;一个工作节点&#xff09;的K8S集群。 参考这篇文章&#xff1a; Ubuntu 22.04 搭建K8…

基于java,springboot的论旅游管理系统设计与实现

环境以及简介 基于java,springboot的论旅游管理系统设计与实现&#xff0c;Java项目&#xff0c;SpringBoot项目&#xff0c;含开发文档&#xff0c;源码&#xff0c;数据库以及ppt 源码下载 环境配置&#xff1a; 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服…
最新文章