随着互联网技术的发展,流媒体服务变得越来越流行。然而,传统的流媒体传输方式面临着带宽消耗大、服务器负载高等问题。为了解决这些问题,点对点(P2P)技术被引入到流媒体传输中。本文将详细介绍如何使用 ArtPlayer 和 P2P Media Loader 来实现点对点流媒体加速。

介绍

ArtPlayer 是一个基于HTML5的开源视频播放器,支持多种视频格式和流媒体协议,具备跨平台兼容性和丰富的自定义功能。它能够提供流畅的播放体验,并支持多种交互操作,如播放、暂停、全屏等。

P2P Media Loader 是一种利用P2P技术进行媒体内容加载的工具,它通过将媒体文件分散存储在多个用户设备上,实现高效的数据传输和内容共享。这种技术可以显著提高大文件传输的速度和可靠性,同时降低中心服务器的负载。

实现流程

流程原理图

目前 P2P Media Loader 只支持 HLS 和 MPEG-DASH 协议的自适应码率流,要实现还需要配合相应库,本次就主要讲解一下将 P2P 与 ArtPlayer 和 Hls.js 集成。

这边我已经写好了一个简单的完整示例。下面是在线播放测试,直接多个 标签页/浏览器/设备 打开当前页面即可查看效果。

具体详细代码可去仓库里查看,可以自己下载尝试一下,代码的相应位置也都做了详细的注释。

常见问题

模块引用

官方的ES模块分为 core 模块 和 hls集成模块(这个模块没有引用hls库,在实际使用中还是要单独引用hls库)

我们在实际使用时不用引用全部的模块,只需要先引用 hls 库,再引用 hls集成模块 就行,这个 hls集成模块 代码我看了一下会调用核心库,在第13行左右有 import { CoreRequestError, debug, Core } from "p2p-media-loader-core";

最开始我自己在测试时发现了个问题,直接引用使用时 hls集成模块 会报错,提示在第13行引用 核心模块 时路径错误、找不到名为 “p2p-media-loader-core” 的文件,我就去修改了一下 hls集成模块 里引用路径和文件名,修改成 import { CoreRequestError, debug, Core } from "./p2p-media-loader-core.es.js"; (这里添加了 ./ 这个表示在当前目录下,然后写出了完整文件名)然后将两个模块文件放在同一目录下就好了。

如何工作的

Web 浏览器运行与 P2P Media Loader 库集成的视频播放器。库的每个实例都称为一个对等体,并且统称为许多对等体形成 P2P 网络.

P2P Media Loader 最初通过 HTTP(S) 从源服务器或 CDN 下载媒体段,以快速开始媒体播放。如果没有可用的对等方,它将继续通过 HTTP(S) 下载段,类似于传统媒体流。

随后,P2P Media Loader 将媒体流详细信息和连接信息(例如 ICE c和idates)传输到 WebTorrent 跟踪器。这些跟踪器提供访问同一媒体流的其他对等方的列表。

然后​,P2P Media Loader 与这些对等方连接以下载其他媒体段,并同时共享已下载的段。

P2P群中的r和om对等体会定期通过HTTP(S)下载新段,并通过P2P将其分发给其他人。

自定义配置

通过上面的流程和工作原理我们知道要实现P2P网络是需要 STUN服务器 和 WebTorrent跟踪器,默认情况下,P2P Media Loader 配置为使用公共 STUN 和 WebTorrent 服务器,这意味着 P2P 网络无需运行任何服务器端软件即可在简单用例中运行。

测试时你可以不用额外配置 STUN服务器 和 WebTorrent跟踪器,但是在生产中使用不推荐使用公共跟踪器,因为它们支持有限数量的对等体,并且可能会拒绝连接,甚至在重负载下宕机。

所以推荐自己搭建 WebRTC服务器,wt-tracker 这个项目非常合适,详细搭建教程可以看我另一篇文章。

如果你不想使用公共的跟踪器,可以配置个人跟踪器和 STUN 服务器,具体示例如下:

const HlsWithP2P = HlsJsP2PEngine.injectMixin(window.Hls);
const hls = new HlsWithP2P({
    p2p: {
        core: {
            // 配置 Tracker 服务器
            announceTrackers: [
                "wss://personal.tracker1.com",
                "wss://personal.tracker2.com"
            ],
            // 配置 STUN 服务器
            rtcConfig: {
                iceServers: [
                    { urls: "stun:stun.l.google.com:19302" },
                    { urls: "stun:global.stun.twilio.com:3478?transport=udp" }
                ]
            }
        }
    }
});

官方文档

P2P Media Loader官方文档写的很详细,其他播放器配合使用示例也有,相关api功能以及使用方法都有,只是全是英文。推荐使用Edge浏览器访问,开启翻译浏览。

总结

通过本篇文章,你将能够基本掌握如何使用 ArtPlayer 和 P2P Media Loader 实现点对点流媒体传输,从而降低服务器负载并提升播放流畅度。如果对P2P Media Loader有进一步的疑问,也可以参考其官方文档或在文章下方评论说明,博主有时间会耐心解答。

最后修改:2024 年 08 月 21 日
如果觉得我的文章对你有用,请随意赞赏