AI 摘要

这篇文章讲了ArtPlayer的弹幕插件是如何处理用户发送的弹幕信息,包括弹幕的颜色、模式和文本内容。用户通过输入框发送弹幕时,插件会构造一个包含这些信息的danmu对象,并在beforeEmit回调中进行拦截,便于将弹幕数据发送到服务器。文章描述了前端代码示例,其中提取danmu对象的属性,并通过fetch将其提交到后端进行保存。此外,后端PHP会接收这些数据,并将弹幕写入XML文件,采用Bilibili格式。用户选择的颜色和模式被转换为对应的类型与颜色值以适应XML格式要求。最后,文章强调了ArtPlayer提供的配置支持,推荐开发者通过配置接口来满足自定义需求,而不是直接修改插件源代码。

弹幕参数结构说明

ArtPlayer 的弹幕插件在用户通过内置输入框发送弹幕时,会构造一个 danmu 对象传递给 beforeEmit 回调。该对象包含了用户输入的文本和所选的样式信息,包括:

  • text – 弹幕文本内容
  • time – 弹幕出现的时间点(当前视频播放时间,以秒计)
  • mode – 弹幕模式/位置,数值表示弹幕类型(例如 0 表示滚动弹幕,1 表示顶端固定,2 表示底端固定)
  • color – 弹幕颜色,字符串形式的颜色代码(如 #FFFFFF 表示白色)

上述字段会根据用户在弹幕输入面板中选定的“模式”和“颜色”自动填充。例如,用户选择了顶部模式和红色,则 danmu.mode = 1(顶部),danmu.color = "#FE0302"(红色的十六进制代码)等。代码中可以看到插件默认将 mode 初始化为 0(滚动),颜色默认 #FFFFFF(白色)。内置的样式面板提供了模式切换(滚动/顶部/底部)和颜色选择功能。

前端 beforeEmit 拦截示例

ArtPlayer 弹幕插件支持通过 beforeEmit 钩子拦截用户弹幕发送操作。可以在此回调中获取到包含 modecolor 等信息的 danmu 对象,从而将弹幕数据发送到服务器保存。默认情况下,beforeEmit 返回 false(代码中为!0)表示不拦截,直接发送。我们可以自定义这个回调函数,例如使用 fetch 提交弹幕数据:

artPlayer.plugins.artplayerPluginDanmuku.config({
beforeEmit: (danmu) => {
// 提取弹幕内容和样式字段
const { text, time, color, mode } = danmu;
// 准备POST数据(表单格式)
const params = new URLSearchParams({ text, time, color, mode });
// 异步发送到后台接口保存弹幕
fetch('/api/send_danmu.php', { method: 'POST', body: params })
.catch(err => console.error('发送弹幕失败', err));
// 返回 false 允许插件继续显示弹幕
return false;
}
});

上述示例中,danmu.textdanmu.colordanmu.mode 分别携带了用户输入的文本、选择的颜色和模式,我们使用它们构造请求。重要: beforeEmit 必须返回一个值(或Promise)。当返回值严格等于 true 时,插件会停止后续默认流程,不再自动发送弹幕;返回 false 或任何非 true 的值则表示不拦截,允许弹幕正常显示。因此,在执行完自定义发送逻辑后返回 false,即可让弹幕既提交后台又正常出现在当前播放器中。

后端 PHP 接收与处理逻辑

后端接收上述请求后,需要将弹幕写入 XML 文件(通常采用类似 Bilibili 弹幕 XML 的格式)。在 PHP 中,可以通过 $_POST 获取提交的字段,例如:

<?php
// 获取POST提交的弹幕字段
$text = $_POST['text'];
$time = floatval($_POST['time']);
$mode = intval($_POST['mode']);
$colorHex = $_POST['color']; // 例如 "#FE0302"
$colorDec = hexdec(ltrim($colorHex, '#')); // 转换为整数颜色值
// 根据 mode 转换为弹幕类型(type),与XML格式对应
if ($mode === 0) {
$type = 1; // 滚动弹幕
} elseif ($mode === 1) {
$type = 5; // 顶部弹幕
} elseif ($mode === 2) {
$type = 4; // 底部弹幕
}
// 加载 XML 文件并追加弹幕节点
$xml = simplexml_load_file('danmu.xml');
$new = $xml->addChild('d', htmlspecialchars($text, ENT_QUOTES));
$pAttr = sprintf('%.3f,%d,25,%d,%d,0,0,0', $time, $type, $colorDec, time());
$new->addAttribute('p', $pAttr);
$xml->asXML('danmu.xml');

上述代码中,pAttr 是按 Bilibili 弹幕格式构造的属性字符串,包括出现时间类型字号颜色时间戳弹幕池发送者ID弹幕ID共8个字段【10†L1-L7】。我们将用户选择的 mode 转换成对应的弹幕类型 type(0→1滚动,1→5顶端,2→4底部),将 color 从十六进制转换为整数值,以确保写入的 XML 符合弹幕格式要求【10†L1-L7】。例如,用户选择红色(#FE0302)将转换为十进制 16724738 并写入。这样保存后,新弹幕行可能类似于:

<d p="12.347,1,25,16724738,1681112345,0,0,0">弹幕文本</d>

其中 12.347 是时间(秒),1 是类型(滚动),25 是字号,16724738 是颜色值,后面的 1681112345 是发送Unix时间戳,其余用0占位。【10†L1-L7】

当播放器下次加载弹幕时(或调用插件的 load 方法),这些字段都会被解析:例如插件解析时会把类型映射回 mode,将颜色值转回 hex【10†L1-L7】,确保前端正确显示颜色和位置。

官方文档和配置支持

从 ArtPlayer 弹幕插件的官方实现来看,输入弹幕的颜色和位置是受到支持且可配置的。插件默认启用内置输入框(emitter: true)及样式面板,让用户可以直接选择预设的颜色和模式,无需开发者额外实现。在默认配置中,color 初始为白色 (#FFFFFF),mode 初始为 0(滚动),并提供了一个默认颜色列表供用户选择。开发者也可以通过插件配置项自定义这些默认值和可选颜色:

  • 自定义颜色列表:在初始化弹幕插件时传入 COLOR 数组即可覆盖默认颜色选项。例如:COLOR: ['#FF0000','#00FF00', ...]。这样用户在输入面板将看到提供的颜色按钮列表。
  • 默认颜色和模式:可以设置 color: '#FFFF00'mode: 2 等,改变弹幕输入的默认颜色或默认模式。modes: [0,1,2] 则决定允许显示/发送的弹幕类型范围。
  • 其他配置:如 fontSizeopacityantiOverlap 等也可在初始化时配置,插件会据此调整弹幕显示行为。

官方推荐的做法是使用 ArtPlayer 提供的这些配置接口来满足自定义需求,而不要擅自修改插件源代码。通过配置,我们可以开启 emitter(实际上默认已开启)并利用 beforeEmit 实现后端通信。例如,ArtPlayer 插件文档中提到直接在 beforeEmit 中返回一个 Promise 或布尔来控制弹幕发送。综合来看,ArtPlayer 弹幕插件本身完全支持弹幕颜色和位置的自定义输入以及拦截处理,我们按照官方提供的钩子和配置即可实现弹幕 颜色/位置 字段的保存与回放。