弹幕参数结构说明
ArtPlayer 的弹幕插件在用户通过内置输入框发送弹幕时,会构造一个 danmu
对象传递给 beforeEmit
回调。该对象包含了用户输入的文本和所选的样式信息,包括:
- text – 弹幕文本内容
- time – 弹幕出现的时间点(当前视频播放时间,以秒计)
- mode – 弹幕模式/位置,数值表示弹幕类型(例如
0
表示滚动弹幕,1
表示顶端固定,2
表示底端固定) - color – 弹幕颜色,字符串形式的颜色代码(如
#FFFFFF
表示白色)
上述字段会根据用户在弹幕输入面板中选定的“模式”和“颜色”自动填充。例如,用户选择了顶部模式和红色,则 danmu.mode = 1
(顶部),danmu.color = "#FE0302"
(红色的十六进制代码)等。代码中可以看到插件默认将 mode
初始化为 0
(滚动),颜色默认 #FFFFFF
(白色)。内置的样式面板提供了模式切换(滚动/顶部/底部)和颜色选择功能。
前端 beforeEmit
拦截示例
ArtPlayer 弹幕插件支持通过 beforeEmit
钩子拦截用户弹幕发送操作。可以在此回调中获取到包含 mode
和 color
等信息的 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.text
、danmu.color
、danmu.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]
则决定允许显示/发送的弹幕类型范围。 - 其他配置:如
fontSize
、opacity
、antiOverlap
等也可在初始化时配置,插件会据此调整弹幕显示行为。
官方推荐的做法是使用 ArtPlayer 提供的这些配置接口来满足自定义需求,而不要擅自修改插件源代码。通过配置,我们可以开启 emitter(实际上默认已开启)并利用 beforeEmit
实现后端通信。例如,ArtPlayer 插件文档中提到直接在 beforeEmit
中返回一个 Promise 或布尔来控制弹幕发送。综合来看,ArtPlayer 弹幕插件本身完全支持弹幕颜色和位置的自定义输入以及拦截处理,我们按照官方提供的钩子和配置即可实现弹幕 颜色/位置 字段的保存与回放。
Comments NOTHING