分享推动进步
一位定居新西兰的自由码农

未分类

ArtPlayer配合P2P Media Loader实现点对点流媒体加速

阅读(22)

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

介绍

https://github.com/zhw2590582/ArtPlayer

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

https://github.com/Novage/p2p-media-loader

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

实现流程

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

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

示例代码仓库:

https://github.com/ecmlk/p2p-artplayer-hls-demo

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

常见问题

模块引用

官方的 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 这个项目非常合适,详细搭建教程可以看我另一篇文章  宝塔面板构建运行 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 浏览器访问,开启翻译浏览。

官方文档地址:P2P Media Loader Documentation

总结

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

m3u8如何广告植入

阅读(17)

前言
如果是内容提供商或者是做大做强的流量方,那么可以对视频内容进行运营。广告种类很多,承载的方式大多是图和视频。
如何往视频内容植入广告呢?假设我们往mp4视频源植入视频广告,我们可以采用两段视频concat的方式。但是这个有什么弊端呢?就是广告植入是固定的,如果是多变参数的视频源,那么需要进行重复操作,oss/cos存储也需要多份。在极大增加成本的同时,也没办法运营,既不能实时运营,也不能按用户运营。
基于这些考虑,我们选用m3u8文件格式进行技术开发。参考《第五篇、保护视频安全的手段》我们将视频文件进行ts切片,输出了固定时间长度的ts格式切片序列。
广告视频处理
我们进行广告植入,首先要处理的就是将广告视频转换成适合m3u8文件描述播放文件序列的ts文件。
ffmpeg -i xxx.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb ad.ts
以上命令可以将输入视频直接转换成适配m3u8的ts文件格式。这里省略了其他的视频处理参数,包括编码、分辨率、码率、帧率这些。这里还有几个问题需要关心。

ad.ts的播放时长
ad.ts的转码参数

在m3u8文件通过#EXT-X-TARGETDURATION:2约束每个切片的最大时间长度。这里表示每个切片文件最大是2秒钟。也需要尽量保证每个ts编码格式是一致的。
对原视频处理
参考《第五篇、保护视频安全的手段》的m3u8文件格式如下:

EXTM3U

EXT-X-VERSION:3

EXT-X-TARGETDURATION:2

EXT-X-MEDIA-SEQUENCE:0

EXT-X-PLAYLIST-TYPE:VOD

EXT-X-ALLOW-CACHE:NO

EXT-X-DISCONTINUITY-SEQUENCE:0

EXTINF:2.033333,

out_ts0.ts

EXTINF:1.966667,

out_ts1.ts

EXTINF:2.000000,

out_ts2.ts
…

EXT-X-ENDLIST

可以看到m3u8文件格式比较固定,通过#EXTINF:2.033333开始描述1个ts文件,2.033333表示接下来ts文件时间长度,out_ts0.ts指向当前目录文件。通过#EXT-X-ENDLIST表示m3u8文件播放完成。
从本质上m3u8就是文本格式的描述文件,我们在播放器请求m3u8播放源的时候拦截,插入广告ts序列后再返回给客户端即可以完成广告植入。编辑修改后的m3u8格式如下:

EXTM3U

EXT-X-VERSION:3

EXT-X-TARGETDURATION:2

EXT-X-MEDIA-SEQUENCE:0

EXT-X-PLAYLIST-TYPE:VOD

EXT-X-ALLOW-CACHE:NO

EXT-X-DISCONTINUITY-SEQUENCE:0

EXTINF:26.810000,

ad.ts

EXTINF:2.033333,

out_ts0.ts

EXTINF:1.966667,

out_ts1.ts

EXTINF:2.000000,

out_ts2.ts
…

EXT-X-ENDLIST

如果ad.ts文件太大,会影响视频播放延迟,我们应该针对ad.ts文件进行切片,最好与实际对原视频切片参数保持一致,再按照上述方式植入到m3u8文件中。既保证了播放速度,也完成了视频广告植入。

注意#EXT-X-ALLOW-CACHE:NO参数表示当前m3u8文件不缓存本地,保障广告植入及时更新。
ad.ts和原视频ts解码参数不同,需要引入#EXT-X-DISCONTINUITY-SEQUENCE:0#EXT-X-DISCONTINUITY描述,表示前后ts采用不同的解码器参数进行解码播放。
注意播放器需要响应广告播放跳过逻辑,业务上需要对广告内容进行返回。

结论
采用上述方式对原视频植入视频广告,广告视频和原视频只需要存储1份,然后自由组合投放策略,可以实时运营广告内容,按投放结果植入广告内容。