【音视频】M3U8与HLS详解
创始人
2024-09-25 16:24:09

文章目录

  • 前言
    • M3U8详解
      • M3U8 是什么
      • M3U8 文件的组成部分
      • 示例 M3U8 文件
    • HLS
      • HLS(HTTP Live Streaming)视频封装格式
        • HLS 视频封装格式的主要组成部分
      • 示例 HLS 主播放列表文件(Master Playlist)
      • 示例 HLS 媒体播放列表文件(Media Playlist)
      • HLS 封装格式的特点
      • HSL(HTTP Stream Live)的视频封装格式
      • TS 文件介绍
      • TS 文件的优势
      • HLS 使用 TS 视频文件的原因
      • 示例 TS 文件结构
  • 总结


前言

M3U8 和 HLS 是音视频流媒体领域中常见的技术,广泛应用于在线视频点播(VOD)和直播(Live)场景。M3U8 是一种基于文本的播放列表文件格式,主要用于描述媒体文件的位置和顺序,而 HLS(HTTP Live Streaming)是一种流媒体传输协议,由 Apple 公司提出。HLS 使用 M3U8 文件来管理和播放流媒体内容,能够适应不同的网络环境,实现高质量、低延迟的流媒体传输。


M3U8详解

M3U8 是什么

M3U8 是一种基于文本的文件格式,用于描述音视频文件的播放列表。它是 M3U 文件的一种扩展,M3U 文件主要用于音频播放列表,而 M3U8 则用于音视频流媒体播放。M3U8 文件使用 UTF-8 编码,通常用于 HTTP Live Streaming (HLS) 协议中,作为媒体分片的索引文件。

M3U8 文件的组成部分

一个典型的 M3U8 文件包含多个标签,每个标签都以井号(#)开头。以下是 M3U8 文件的主要组成部分:

  1. 文件头

    • #EXTM3U:所有 M3U8 文件的起始标签,表明这是一个 M3U8 文件。
  2. 基本标签

    • #EXTINF:,</code>:描述媒体分片的信息。<code><duration></code> 是分片的时长(以秒为单位),<code><title></code> 是可选的分片标题。</li><li>URL:实际媒体文件的位置,通常紧跟在 <code>#EXTINF</code> 标签之后。</li></ul></li><li><p><strong>可选标签</strong></p><ul><li><code>#EXT-X-TARGETDURATION:<seconds></code>:指定媒体分片的最大时长。</li><li><code>#EXT-X-MEDIA-SEQUENCE:<number></code>:定义播放列表中第一个分片的序列号。</li><li><code>#EXT-X-VERSION:<number></code>:指定播放列表文件的协议版本。</li><li><code>#EXT-X-ALLOW-CACHE:<YES|NO></code>:指示客户端是否可以缓存播放列表文件。</li><li><code>#EXT-X-ENDLIST</code>:指示播放列表的结束,常用于点播流。</li><li><code>#EXT-X-KEY:<attributes></code>:描述用于解密媒体分片的密钥信息,包含多个属性(如方法、URI 等)。</li><li><code>#EXT-X-STREAM-INF:<attributes></code>:用于描述变码率(多码率)流信息,包含分辨率、带宽等属性。</li></ul></li></ol><h4>示例 M3U8 文件</h4> <pre><code class="prism language-plaintext">#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, http://example.com/segment0.ts #EXTINF:10.0, http://example.com/segment1.ts #EXTINF:10.0, http://example.com/segment2.ts #EXT-X-ENDLIST </code></pre> <p>以上示例展示了一个简单的 M3U8 文件,其中包含版本信息、目标时长、媒体序列号和三个媒体分片。每个分片的时长为 10 秒,URL 指向实际的媒体文件位置。最后,<code>#EXT-X-ENDLIST</code> 标签表示播放列表的结束。</p><h3>HLS</h3><h4>HLS(HTTP Live Streaming)视频封装格式</h4><p>HLS(HTTP Live Streaming)是由 Apple 公司开发的一种流媒体传输协议,广泛用于直播和点播视频流的传输。HLS 协议将视频文件分割成一系列较小的媒体文件(通常称为分片),通过 HTTP 进行传输,并使用 M3U8 播放列表文件来管理这些分片。</p><h5>HLS 视频封装格式的主要组成部分</h5><ol><li><p><strong>M3U8 播放列表文件</strong></p><ul><li><strong>Master Playlist(主播放列表)</strong>:用于描述不同比特率和分辨率的变码率流,每个流有一个相应的 Media Playlist。</li><li><strong>Media Playlist(媒体播放列表)</strong>:包含实际的媒体分片的 URL 和相关信息。每个分片的 URL 通常紧跟在 <code>#EXTINF</code> 标签之后。</li></ul></li><li><p><strong>媒体分片</strong></p><ul><li><strong>.ts 文件(MPEG-TS)</strong>:HLS 主要使用 MPEG-TS(MPEG Transport Stream)格式来封装视频和音频数据。每个 .ts 文件是一个视频分片,包含一段视频和音频数据。</li><li><strong>.aac 文件</strong>:在某些情况下,音频数据也可以单独存储为 .aac 文件。</li></ul></li></ol><h4>示例 HLS 主播放列表文件(Master Playlist)</h4> <pre><code class="prism language-plaintext">#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=640x360 http://example.com/low.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720 http://example.com/mid.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5120000,RESOLUTION=1920x1080 http://example.com/high.m3u8 </code></pre> <h4>示例 HLS 媒体播放列表文件(Media Playlist)</h4> <pre><code class="prism language-plaintext">#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, http://example.com/segment0.ts #EXTINF:10.0, http://example.com/segment1.ts #EXTINF:10.0, http://example.com/segment2.ts #EXT-X-ENDLIST </code></pre> <h4>HLS 封装格式的特点</h4><ul><li><strong>分段传输</strong>:将视频文件分割成小的分片文件,便于在不稳定的网络环境下进行传输。</li><li><strong>自适应比特率</strong>:支持不同比特率和分辨率的流,客户端可以根据网络状况动态选择合适的流进行播放。</li><li><strong>基于 HTTP 传输</strong>:使用标准的 HTTP 协议进行传输,兼容性强,易于通过 CDN(内容分发网络)进行分发。</li></ul><h4>HSL(HTTP Stream Live)的视频封装格式</h4><p>目前并没有广泛承认的 HSL(HTTP Stream Live)作为一种独立的流媒体传输协议,HLS(HTTP Live Streaming)是标准且被广泛应用的协议。HLS 已经被许多视频流媒体服务和播放器广泛支持。如果您指的是某种自定义或特定公司的流媒体技术,可能需要具体说明其详细信息。</p><p>总结而言,HLS 是一种成熟且广泛应用的流媒体传输协议,使用 M3U8 播放列表文件和 MPEG-TS 分片文件来实现稳定、高效的流媒体播放。</p><h4>TS 文件介绍</h4><p>TS(Transport Stream,传输流)文件是一种用于多媒体数据传输和存储的容器格式。TS 文件主要用于传输和存储视频、音频和数据,特别是在广播和流媒体应用中。MPEG-TS(MPEG Transport Stream)是 TS 文件的一个常见实现,它是一种标准化的数字容器格式,用于传输音频、视频和数据。TS 文件格式设计目的是在不可靠的传输介质(如广播网络或互联网)上提供可靠的传输。</p><h4>TS 文件的优势</h4><ol><li><p><strong>抗误码能力强</strong>:TS 文件设计用于在不可靠的传输介质上工作,具有很强的纠错能力,能够在传输过程中有效应对数据丢失和错误。</p></li><li><p><strong>实时传输</strong>:TS 文件支持实时数据流传输,适合用于直播和流媒体应用,能够保证数据的实时性。</p></li><li><p><strong>灵活的多路复用</strong>:TS 文件可以包含多个音视频流和数据流,并且可以灵活地进行多路复用和解复用,支持多种分辨率和比特率的组合。</p></li><li><p><strong>同步性好</strong>:TS 文件格式通过时间戳(PTS/DTS)保证了音频和视频流的同步,确保了播放过程中的同步性和一致性。</p></li><li><p><strong>标准化</strong>:MPEG-TS 是国际标准,得到广泛支持和应用,兼容性好,能够与多种硬件和软件设备配合使用。</p></li></ol><h4>HLS 使用 TS 视频文件的原因</h4><ol><li><p><strong>广泛支持</strong>:MPEG-TS 是一个成熟的国际标准,得到了广泛的支持。几乎所有的流媒体服务器和播放器都支持 TS 文件格式,使其成为流媒体传输的理想选择。</p></li><li><p><strong>分片传输</strong>:HLS 协议将视频流分割成多个小的 TS 分片,每个分片包含几秒钟的视频和音频数据。这样可以在网络环境不稳定的情况下,逐片传输和播放,减少播放中断的可能性。</p></li><li><p><strong>实时性</strong>:TS 文件格式支持实时流媒体传输,适合用于直播等需要实时传输的场景。HLS 使用 TS 文件可以保证数据的实时传输和播放。</p></li><li><p><strong>纠错能力</strong>:由于 TS 文件具有很强的纠错能力,能够在传输过程中应对数据丢失和错误,确保传输的可靠性和数据的完整性。</p></li><li><p><strong>多路复用和同步</strong>:TS 文件支持多路复用,可以在一个文件中同时包含多个音视频流和数据流。通过时间戳(PTS/DTS),TS 文件能够保证音视频的同步播放,提供良好的用户体验。</p></li></ol><h4>示例 TS 文件结构</h4><p>TS 文件由多个固定大小(188 字节)的数据包组成,每个数据包包含头部和有效负载。头部通常包含同步字节、标志和 PID(Packet Identifier),用于标识和管理不同的流。</p> <pre><code class="prism language-plaintext">| 188 bytes TS Packet | |----------------------| | Sync Byte | Header | Payload | </code></pre> <hr /><h2>总结</h2><p>M3U8 和 HLS 是现代流媒体技术的核心组成部分,它们通过简便的播放列表格式和高效的传输协议,实现了稳定、灵活的音视频播放体验。M3U8 文件提供了对媒体资源的详细描述,而 HLS 则通过分段传输和自适应比特率技术,保证了在各种网络条件下的流畅播放。随着流媒体应用的不断发展,M3U8 和 HLS 的使用场景将更加广泛,为用户提供更好的音视频服务。</p><link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-f23dff6052.css" rel="stylesheet"><link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-c216769e99.css" rel="stylesheet"> <!--end::Text--> </div> <!--end::Description--> <div class="mt-5"> <!--关键词搜索--> </div> <div class="mt-5"> <p class="fc-show-prev-next"> <strong>上一篇:</strong><a href="/dnzs/34418.html">Qt框架下实现商品库存管理系统</a><br> </p> <p class="fc-show-prev-next"> <strong>下一篇:</strong><a href="/dnzs/34420.html">4、设备树(DT)</a> </p> </div> <!--begin::Block--> <div class="d-flex flex-stack mb-2 mt-10"> <!--begin::Title--> <h3 class="text-dark fs-5 fw-bold text-gray-800">相关内容</h3> <!--end::Title--> </div> <div class="separator separator-dashed mb-9"></div> <!--end::Block--> <div class="row g-10"> </div> </div> <!--end::Table widget 14--> </div> <!--end::Col--> <!--begin::Col--> <div class="col-xl-4 mt-0"> <!--begin::Chart Widget 35--> <div class="card card-flush h-md-100"> <!--begin::Header--> <div class="card-header pt-5 "> <!--begin::Title--> <h3 class="card-title align-items-start flex-column"> <!--begin::Statistics--> <div class="d-flex align-items-center mb-2"> <!--begin::Currency--> <span class="fs-5 fw-bold text-gray-800 ">热门资讯</span> <!--end::Currency--> </div> <!--end::Statistics--> </h3> <!--end::Title--> </div> <!--end::Header--> <!--begin::Body--> <div class="card-body pt-3"> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/603045.html" class="text-dark fw-bold text-hover-primary fs-6">原创 中...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">在阅读文章前,辛苦您点下“关注”,方便讨论和分享。作者定会不负众望,按时按量创作出更优质的内容 文...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/603044.html" class="text-dark fw-bold text-hover-primary fs-6">影石创新遭巨头“密集攻击”?刘...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">来源:市场资讯 (来源:达摩财经) 影石创新日前正式发布全球首款全景无人机“影翎Antigravi...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/603043.html" class="text-dark fw-bold text-hover-primary fs-6">欧盟调查谷歌利用网络内容支持A...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">新华社布鲁塞尔12月9日电(记者丁英华 张兆卿)欧盟委员会9日宣布,对美国谷歌公司利用网络内容为其人...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/603042.html" class="text-dark fw-bold text-hover-primary fs-6">圣奥化学公布新型绿色防老剂SA...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">来源:市场资讯 (来源:中国化工信息周刊) 关键词 | 圣奥化学SA6000开发进展 共 1064字...</span> </div> <!--end::Title--> </div> <!--begin::Item--> <div class="d-flex flex-stack mb-7"> <!--begin::Symbol--> <!--end::Symbol--> <!--begin::Title--> <div class="m-0"> <a href="/news/603041.html" class="text-dark fw-bold text-hover-primary fs-6">人工智能也有“真香定律”!从科...</a> <span class="text-gray-600 fw-semibold d-block pt-1 fs-7">潮新闻客户端 记者 谢春晖 通讯员 姜慧君 方临明 人工智能浪潮奔涌。从率先布局抢占赛道先机,到...</span> </div> <!--end::Title--> </div> </div> <!--end::Body--> </div> <!--end::Chart Widget 35--> </div> <!--end::Col--> </div> </div> <!--end::Content container--> </div> <!--end::Content--> </div> <!--end::Content wrapper--> <!--begin::Footer--> <div id="kt_app_footer" class="app-footer"> <!--begin::Footer container--> <div class="app-container container-xxl d-flex flex-column flex-md-row flex-center flex-md-stack py-3"> <!--begin::Copyright--> <div class="text-dark order-2 order-md-1"> <span class="text-muted fw-semibold me-1">2025 ©</span> 泰达科技网<a href="http://tansuo.caiding5.cn/">财丁探索</a><a href="http://www.hgjy100.com/">汉高教育网</a><a href="http://www.bitekongjian.com/">比特空间</a><a href="http://www.tdroid.net/">太卓网</a><a href="http://www.nengyuan100.com/">能源100</a><a href="http://www.gangyiku.com/">易库网</a><a href="http://www.hcygmm.com/">汇川网</a><a href="http://www.dcglq.cn/">电池功率网</a><a href="http://ic.tdroid.net/">太卓IC网</a> </div> <!--end::Copyright--> <!--begin::Menu--> <ul class="menu menu-gray-600 menu-hover-primary fw-semibold order-1"> <li class="menu-item"> <a href="/news/" target="_blank" class="menu-link px-2">科技资讯</a> </li> <li class="menu-item"> <a href="/dnzs/" target="_blank" class="menu-link px-2">电脑知识</a> </li> </ul> <!--end::Menu--> </div> <!--end::Footer container--> </div> <!--end::Footer--> </div> <!--end:::Main--> </div> <!--end::Wrapper--> </div> <!--end::Page--> </div> <!--end::App--> <div id="kt_scrolltop" class="scrolltop" data-kt-scrolltop="true"> <!--begin::Svg Icon | path: icons/duotune/arrows/arr066.svg--> <span class="svg-icon"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect opacity="0.5" x="13" y="6" width="13" height="2" rx="1" transform="rotate(90 13 6)" fill="currentColor"></rect> <path d="M12.5657 8.56569L16.75 12.75C17.1642 13.1642 17.8358 13.1642 18.25 12.75C18.6642 12.3358 18.6642 11.6642 18.25 11.25L12.7071 5.70711C12.3166 5.31658 11.6834 5.31658 11.2929 5.70711L5.75 11.25C5.33579 11.6642 5.33579 12.3358 5.75 12.75C6.16421 13.1642 6.83579 13.1642 7.25 12.75L11.4343 8.56569C11.7467 8.25327 12.2533 8.25327 12.5657 8.56569Z" fill="currentColor"></path> </svg> </span> <!--end::Svg Icon--> </div> <!--begin::Javascript--> <script>var hostUrl = "/static/default/pc/";</script> <!--begin::Global Javascript Bundle(mandatory for all pages)--> <script src="/static/default/pc/plugins/global/plugins.bundle.js"></script> <script src="/static/default/pc/js/scripts.bundle.js"></script> <!--end::Global Javascript Bundle--> <!--end::Javascript--> </body> <!--end::Body--> </html>