【音視頻】HLS-m3u8協議介紹

參考文檔:https://datatracker.ietf.org/doc/html/rfc8216

一、m3u8協議概述

m3u8 協議是基于 M3U 格式擴展而來的一種多媒體播放列表協議,主要用于流媒體的索引和分發,尤其在 HLS(HTTP Live Streaming)技術中扮演核心角色。它通過文本文件(.m3u8 擴展名)描述媒體片段的地址、時長、編碼信息等,讓客戶端能夠按順序請求并播放流媒體內容。

  1. 起源:m3u8 源于傳統的 M3U 文件(一種音頻播放列表格式,后綴為.m3u),為適應流媒體和 UTF-8 編碼需求,擴展出.m3u8 格式(強制使用 UTF-8 編碼)。

  2. 核心作用:作為流媒體的 “導航地圖”,告訴客戶端:

    • 流媒體包含哪些片段(如.ts 視頻切片);
    • 每個片段的網絡地址、時長、碼率;
    • 可選的多碼率版本(方便客戶端根據網絡狀況切換清晰度)。

二、m3u8文件結構與語法

HLS(HTTP Live Streaming) 把整個流分成?個個?的基于 HTTP 的?件來下載,每次只下載?些。HLS 協議由三部分組成:HTTP、M3U8、TS。這三部分中,HTTP 是傳輸協議,M3U8 是索引?件,TS是?視頻的媒體信息。

HLS 是提供?個 m3u8 地址,Apple 的 Safari 瀏覽器直接就能打開 m3u8 地址,譬如:

http://demo.srs.com/live/livestream.m3u8

Android 不能直接打開,需要使? html5 的 video 標簽,然后在瀏覽器中打開這個??即可,譬如:

<!-- livestream.html -->
<video width="640" height="360"
autoplay controls autobuffer
src="http://demo.srs.com/live/livestream.m3u8"
</video>

HLS 的 m3u8,是?個 ts 的列表,也就是告訴瀏覽器可以播放這些 ts ?件,譬如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:64
#EXT-X-TARGETDURATION:12
#EXTINF:11.550
livestream-64.ts
#EXTINF:5.250
livestream-65.ts
#EXTINF:7.700
livestream-66.ts
#EXTINF:6.850
livestream-67.ts

有?個關鍵的參數,這些參數在 SRS 的配置?件中都有配置項:

  • #EXTM3U:每個M3U?件第??必須是這個tag,請標示作?

  • #EXT-X-VERSION:該屬性可以沒有,?前主要是version 3,最新的是7

  • #EXT-X-MEDIA-SEQUENCE:每?個media URI在PlayList中只有唯?的序號,相鄰之間序號+1,?個media URI并不是必須要包含的,如果沒有,默認為0

  • #EXT-X-TARGETDURATION:所有切?的最?時?。有些 Apple 設備這個參數不正確會?法播放。SRS 會?動計算出 ts ?件的最?時?,然后更新 m3u8 時會?動更新這個值。?戶不必??配置。

  • #EXTINF:ts 切?的實際時?,SRS 提供配置項 hls_fragment,但實際上的 ts 時?還受 gop 影響。

  • ts ?件的數?:SRS 可配置 hls_window(單位是秒,不是數量),指定 m3u8 中保存多少個切?,譬如,每個 ts 切?為 10 秒,窗?為 60 秒,那么 m3u8 中最多保存 6 個 ts 切?,SRS 會?動清理舊的切?。

  • livestream-67.ts:SRS 會?動維護 ts 切?的?件名,在編碼器重推之后,這個編號會繼續增?,保證流的連續性。直到 SRS 重啟,這個編號才重置為 0。

每?個 .m3u8 ?件,分別對應若?個 ts ?件,這些 ts ?件才是真正存放視頻的數據。m3u8 ?件只是存放了?些 ts ?件的配置信息和相關路徑,當視頻播放時,.m3u8 是動態改變的,video標簽會解析這個?件,并找到對應的 ts ?件來播放,所以?般為了加快速度,.m3u8 放在 web 服務器上,ts ?件放在 cdn 上。.m3u8 ?件,其實就是以 utf-8 編碼的 m3u ?件,這個?件本身不能播放,只是存放了播放信息的?本?件。

進入SRS服務器對應的視頻流路徑,可以查看到.m3u8文件

srs/trunk/objs/nginx/html/live

比如這里有個livestreamlivestream2的視頻流,目錄下就存在對應的livestream.tslivestream2.ts文件

查看對應的livestream.m3u8

cat livestream.m3u8

在這里插入圖片描述

m3u8 與 HLS 的關系

  • HLS 是蘋果公司推出的流媒體傳輸協議,而 m3u8 是 HLS 協議中用于描述媒體片段的索引文件格式
  • HLS 的工作流程依賴 m3u8:
    1. 服務器將視頻切分為短片段(通常 5-10 秒,格式為.ts);
    2. 生成 m3u8 文件,列出所有.ts 片段的地址和信息;
    3. 客戶端請求 m3u8 文件,根據其內容依次下載并播放.ts 片段;
    4. 直播場景中,服務器會定期更新 m3u8 文件(刪除舊片段,添加新片段),客戶端周期性拉取最新列表。

在這里插入圖片描述

三、m3u8示例

3.1 簡單的點播 m3u8 文件

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
video_0.ts  # 第一個10秒的視頻片段
#EXTINF:10.0,
video_1.ts  # 第二個10秒的視頻片段
#EXTINF:5.0,
video_2.ts  # 最后一個5秒的視頻片段
#EXT-X-ENDLIST  # 標識播放結束

3.2 多碼率直播 m3u8 文件(主列表)

主 m3u8 文件(用于選擇碼率):

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
  • 包含多種?特率的 Master Playlist。該?件是?個實際使?中的頂級 m3u8 ?件,該?件中?定義了http://example.com/low.m3u8http://example.com/mid.m3u8 等 ? 個 ? 級 ? 件 。 頂 級m3u8 ?件主要是做碼率適配的,?級 m3u8 才是真正的切??件,客戶端會默認選擇碼率最?的請求

  • 如果發現碼率達不到,會請求降低碼率的流。客戶端拿到?級 m3u8 ?件后,會繼續請求??的?件,這時就可以進?播放了。

四、基礎概念

4.1 Playlist file

  • ?個 m3u 的 Playlist 就是?個由多個獨??組成的?本?件,每?由回?/換?區分。每??可以是?個URI、空??或是?個 以 “#” 號開頭的字符串,并且空格只能存在于??中不同元素間的分隔。

  • ?個 URI 表示?個媒體段或是 “variant Playlist file”(最多?持?層嵌套,即?個 m3u8 ?件中嵌套另?個 m3u8),以 “EXT” 開頭的表示?個 “tag”,否則表示注釋,直接忽略。

4.2 Tags

1. #EXTM3U

每個m3u8文件第一行必須是這個tag,如上述兩個示例。

2. #EXT-X-VERSION

  • 作用:指定m3u8文件的版本號。
  • 格式:#EXT-X-VERSION:<版本號>
  • 示例:#EXT-X-VERSION:3

3. #EXTINF

  • 作用:指定每個媒體段(ts文件)的持續時間,僅對其后的URI有效,每兩個媒體段URI間需用此tag分隔。
  • 格式:#EXTINF:<duration>,<title>
  • 示例:#EXTINF:14.357, no desc
  • 參數說明:
    • duration:表示持續時間(單位:秒)。若協議版本小于3,duration必須為整數;版本≥3時可使用浮點數。

4. #EXT-X-BYTERANGE

  • 作用:表示媒體段是某一媒體URI資源中的一段,僅對其后的media URI有效。
  • 格式:#EXT-X-BYTERANGE:<n>[@o]
  • 參數說明:
    • n:表示該區間的大小(字節)。
    • o:表示在URI中的偏移量(可選)。
  • 備注:該標簽在協議版本4及以上出現。

5. #EXT-X-TARGETDURATION

  • 作用:指定當前視頻流中單個切片(ts文件)的最大時長(單位:秒)。#EXTINF中指定的時間長度必須小于或等于該最大值。
  • 格式:#EXT-X-TARGETDURATION:<s>
  • 參數說明:s表示最大秒數。
  • 備注:在整個Playlist文件中只能出現一次(嵌套場景中,通常包含真實ts url的m3u8文件才會出現此tag)。

6. #EXT-X-MEDIA-SEQUENCE

  • 作用:每個media URI在Playlist中擁有唯一序號,相鄰序號遞增1。
  • 格式:#EXT-X-MEDIA-SEQUENCE:<number>
  • 備注:若未包含此tag,默認序號從0開始。

7. #EXT-X-KEY

  • 作用:定義對media segments的解碼方式,作用范圍為下次該tag出現前的所有media URI。
  • 格式:#EXT-X-KEY:<attribute-list>
  • 參數說明:
    • METHOD:加密方法,可選值為NONE(不加密)或AES-128(AES-128加密)。
      • METHOD=NONE,則URIIV屬性必須不存在。
      • METHOD=AES-128(Advanced Encryption Standard),則URI必須存在,IV可選。
    • URI:密鑰文件的獲取地址(當METHOD=AES-128時必選)。
    • IV:初始化向量(Initialization Vector)。若未指定,默認使用媒體序列號(#EXT-X-MEDIA-SEQUENCE)作為IV(將序列號高位填入16字節buffer,左側補0);若指定,需為16字節的十六進制字符串。

8. #EXT-X-PROGRAM-DATE-TIME

  • 作用:將絕對時間或日期與媒體段中的第一個樣本關聯,僅對下一個media URI有效。
  • 格式:#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>
  • 示例:#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

9. #EXT-X-ALLOW-CACHE

  • 作用:指定是否允許緩存媒體段,對所有媒體段有效。
  • 格式:#EXT-X-ALLOW-CACHE:<YES|NO>
  • 備注:可在Playlist文件中任意位置出現,最多出現一次。

10. #EXT-X-PLAYLIST-TYPE

  • 作用:提供關于Playlist可變性的信息,對整個Playlist文件有效(可選標簽)。
  • 格式:#EXT-X-PLAYLIST-TYPE:<EVENT|VOD>
  • 參數說明:
    • VOD:點播視頻。服務器不能修改Playlist文件,所有ts文件已生成完畢。
    • EVENT:實時生成m3u8和ts文件。服務器不能修改或刪除Playlist文件中的內容,但可追加新行,播放時需不斷下載二級index文件。

11. #EXT-X-ENDLIST

  • 作用:表示m3u8文件的結束,直播(live)m3u8文件通常不含此tag。
  • 格式:#EXT-X-ENDLIST
  • 備注:可在Playlist中任意位置出現,但僅能出現一次。

12. #EXT-X-MEDIA

  • 作用:在Playlist中表示相同內容的不同語種/譯文版本(如多語言音頻、多視角視頻),標簽獨立存在。
  • 格式:#EXT-X-MEDIA:<attribute-list>
  • 屬性列表說明:
    • URI:若未指定,表明該tag描述的可選版本存在于主Playlist的EXT-X-STREAM-INF中。
    • TYPE:類型,可選AUDIO(音頻)或VIDEO(視頻)。
    • GROUP-ID:具有相同ID的EXT-X-MEDIA標簽組成一組樣式。
    • LANGUAGE:標識該版本使用的主要語言。
    • NAME:人類可讀的描述字符串,若LANGUAGE存在,描述應使用該語言。
    • DEFAULT:是否默認選擇,可選YESNO(默認NO)。若為YES,客戶端默認播放此版本(用戶手動選擇除外)。
    • AUTOSELECT:是否自動選擇,可選YESNO(默認NO)。若為YES,客戶端在用戶未指定偏好時,根據播放環境自動選擇。
  • 備注:該標簽在協議版本4及以上出現。

13. #EXT-X-STREAM-INF

  • 作用:指定包含多媒體信息的media URI作為Playlist,通常用于m3u8嵌套,僅對緊跟其后的URI有效。
  • 格式:#EXT-X-STREAM-INF:<attribute-list>
  • 常用屬性說明:
    • BANDWIDTH:帶寬(必選)。
    • PROGRAM-ID:十進制整數,唯一標識Playlist文件范圍內的特定描述,可重復。
    • CODECS:指定流的編碼類型(可選)。
    • RESOLUTION:分辨率(可選)。
    • AUDIO:值需與AUDIO類別EXT-X-MEDIA標簽的GROUP-ID屬性匹配(可選)。
    • VIDEO:同上,與VIDEO類別EXT-X-MEDIA標簽的GROUP-ID匹配(可選)。

14. #EXT-X-DISCONTINUITY

  • 作用:標識后續媒體段的以下屬性發生變化:
    • 文件格式(file format)
    • 軌道數量和類型(number and type of tracks)
    • 編碼參數(encoding parameters)
    • 編碼序號(encoding sequence)
    • 時間戳序號(timestamp sequence)

15. #ZEN-TOTAL-DURATION

  • 作用:表示該m3u8文件所包含的ts文件總時長。

更多資料:https://github.com/0voice

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88027.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity入門:動畫等不顯示問題——畫布設置

unity入門&#xff1a;動畫等不顯示問題——畫布設置動畫等不顯示問題大部分原因畫布Canvas總結動畫等不顯示問題大部分原因 1、畫布設置渲染模式不對&#xff0c;下文再講這個問題。 2、在層級雙擊動畫查看動畫大小&#xff0c;有些動畫創建完之后在場景大小實際很小需要在R…

【機器學習筆記 Ⅱ】3 前向傳播

前向傳播&#xff08;Forward Propagation&#xff09;實現詳解 前向傳播是神經網絡中數據從輸入層流向輸出層的過程&#xff0c;通過逐層計算每一層的輸出&#xff0c;最終得到預測結果。以下是其實現原理和步驟的完整解析&#xff1a;1. 前向傳播的核心步驟 (1) 線性變換&…

人體坐姿檢測系統開發實戰(YOLOv8+PyTorch+可視化)

本文將手把手教你構建智能坐姿檢測系統,結合目標檢測與姿態估計技術,實現不良坐姿的實時識別與預警 ### 一、項目背景與價值 現代人每天平均坐姿時間超過8小時,不良坐姿會導致: - 脊椎壓力增加300% - 頸椎病發病率提升45% - 腰椎間盤突出風險增加60% 本系統通過計算機…

卷積神經網絡經典架構演進

LeNet-5 網絡架構 #mermaid-svg-8VgsGVLusLXKY5lE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8VgsGVLusLXKY5lE .error-icon{fill:#552222;}#mermaid-svg-8VgsGVLusLXKY5lE .error-text{fill:#552222;stroke:#5…

mybatis/mybatis-plus添加數據,自增id的值為負數

1、問題概述&#xff1f;使用mybatis-plus的insert方法添加數據的時候&#xff0c;數據雖然添加成功了&#xff0c;但是返回值為false&#xff0c;提示添加失敗。當觀察數據的時候&#xff0c;發現數據的自增主鍵id的值盡然為-1&#xff0c;或者無規律的長串負數&#xff0c;如…

商業創業融資項目計劃書PPT模版

創業融資計劃書PPT模版&#xff0c;營銷模式分析PPT模版&#xff0c;創業計劃書PPT模版&#xff0c;互聯網電商創業推廣手冊PPT模版&#xff0c;商業項目計劃書PPT模版&#xff0c;高端商業計劃通用PPT模版&#xff0c;商業計劃書&#xff0c;科技商業PPT模版 商業創業融資項目…

新人如何入門學習 STM32?

作為一個在嵌入式領域摸爬滾打了近10年的老兵&#xff0c;看到這個問題時我的思緒瞬間回到了當年那個懵懂的自己。說實話&#xff0c;2014年那個夏天&#xff0c;24歲的我剛從機械專業畢業卻被調劑到了廈門某馬的電子部門&#xff0c;第一次聽到"STM32"這個詞的時候&…

clickhouse數據庫表和doris數據庫表遷移starrocks數據庫時建表注意事項總結

目錄零、前言一、clickhouse數據庫表在starrocks數據庫建表時問題總結1.1 數據類型類問題&#xff1a;1.2 數據導出階段&#xff1a;二、doris 數據庫表在starrocks數據庫建表時問題總結2.1 properties不支持的屬性&#xff08;直接刪除&#xff09;&#xff1a;2.2 properties…

社區云管家 - 智慧生活新方式 ——仙盟創夢IDE

社區服務熱門推薦數字化時代的社區服務新形態?在數字化浪潮席卷日常生活的今天&#xff0c;一個集多功能于一體的綜合社區官網正成為連接居民與社區服務的核心紐帶。這類平臺以 “一站式解決生活需求” 為核心&#xff0c;將看房、外賣、物業、快遞、求職、生鮮、出行、文具打…

MongoDB GridFS

MongoDB GridFS 引言 MongoDB 是一種高性能、可擴展的文檔存儲系統,它提供了靈活的數據模型和豐富的查詢功能。在處理大量非結構化數據時,MongoDB 的 GridFS 功能尤為突出。GridFS 是一種用于存儲和檢索大文件的解決方案,它可以存儲任意大小的文件,并將其分解為多個較小的…

Linux中程序的limits中的Max open files的配置由哪些參數決定

在 Linux 中&#xff0c;程序的 Max open files&#xff08;最大打開文件數&#xff0c;即 ulimit -n&#xff09;由多個層級的參數共同控制&#xff0c;具體如下&#xff1a; 1. 內核級全局限制&#xff08;系統默認上限&#xff09; 由 /proc/sys/fs/file-max 控制&#xff0…

git clone xxx.git 提示報錯:fatal: Unable to find remote helper for ‘http‘

[rootroot /home]# git clone http://gitlab.xxx.qunar.com/xx/xxx.git Cloning into ‘xxx’… fatal: Unable to find remote helper for ‘http’ 我今天在Linux服務器上執行git clone一個倉庫的代碼到機器上&#xff0c;但是執行的時候提示上面的錯誤&#xff0c;我就很詫異…

【機器學習筆記Ⅰ】10 特征工程

特征工程&#xff08;Feature Engineering&#xff09;詳解 特征工程是機器學習和數據科學中的核心環節&#xff0c;旨在通過對原始數據的轉換、組合和提取&#xff0c;構建更適合模型的高質量特征。其質量直接決定模型性能上限&#xff08;“數據和特征決定了模型的上限&#…

20250708-03-string結構及命令詳解_筆記

一、字符串操作1. set命令&#xfeff;1&#xff09;set命令詳解&#xfeff;&#xfeff;基本語法與參數命令格式&#xff1a;set key value [ex 秒數]/[px 毫秒數][nx]/[xx]有效期設置&#xff1a;ex參數&#xff1a;以秒為單位設置過期時間&#xff0c;如set a 1 ex 10表示1…

SpringBoot3-集成MybatisPlus

此次操作是在多模塊下進行的&#xff0c;SpringBoot3-規劃多模塊目錄 添加管理依賴 根模塊 zibocoder-parent 的 pom.xml 中添加 MybatisPlus bom 管理依賴 <properties>...<mybatis-plus.version>3.5.12</mybatis-plus.version>... </properties> <…

部署MongoDB

環境:CentOS7 添加 MongoDB 官方 YUM 倉庫 sudo vi /etc/yum.repos.d/mongodb-org-6.0.repo 將以下內容粘貼到文件中(以 MongoDB 6.0 為例): [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86…

重學前端002 --響應式網頁設計 CSS 基礎

文章目錄css 樣式特殊說明根據在這里 Freecodecamp 實踐&#xff0c;調整順序后做的總結。 css 樣式 body {background-color: red; # 跟background-image 不同時使用background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);font-family: sans-…

Zig高并發爬取數據簡潔模版

上文中我們介紹了Zig語言得爬蟲的有些優劣勢&#xff0c;想必大家對于自身項目選擇那種語言做爬蟲應該有些思路了&#xff0c;今天我將使用Zig的標準庫來構建一個簡單的高并發爬蟲模板。由于Zig的異步機制和標準庫中的http模塊&#xff0c;我們可以實現一個基于事件循環的爬蟲。…

IS-IS 協議 | LSP 傳輸與鏈路狀態數據庫同步機制

略作整理&#xff0c;待校。IS-IS 中 SRM 與 SSN 標志的作用及協同機制 SRM 和 SSN 標志的作用 在 IS-IS 協議中&#xff0c;SRM 和 SSN 是兩個關鍵標志&#xff0c;用于控制和優化 LSP&#xff08;Link State PDU,鏈路狀態信息&#xff09;在網絡中的泛洪與同步過程。 一、SRM…

xxl-job 改造適配pg數據后的Jenkins自動部署

接上文適配pg數據庫之后需要進行部署&#xff0c;便有了此文 1.下載并安裝Jenkins如下&#xff1a; https://mirrors.jenkins.io/war-stable/2.504.3/jenkins.war nohup java -jar jenkins.war --httpPort8080 & 啟動Jenkins并解鎖安裝需要的環境&#xff0c;git&#xff0…