保障页面录制可靠性
页面录制场景下,网络异常等偶然因素可能会造成以下问题:
- 无法正常访问待录制页面,如页面加载失败或时间过长,无法获知真正开始有效录制的时间点,可能会丢录重要内容。
- 可以正常访问待录制页面,但未能正确加载页面中的 HTML 元素。
- 录制过程中未能正常加载页面中发生变化的 HTML 元素,从而导致录制内容与预期不一致。
- 未能正常播放待录制页面中的音视频。
- 页面录制异常停止。
为了确保页面录制的内容与预期一致,声网建议你按照以下方案来提高页面录制的可靠性。
使用该功能需要开启消息通知服务,以便接收服务端事件回调。
录制启动时的保障
建议你通过如下步骤确认录制服务已成功启动:
-
每次
acquire
请求获取到 Resource ID 后的 2 秒内立即发起对应的start
请求。批量获取 Resource ID 后进行批量start
请求可能导致请求失败。acquire
和start
的请求需配对调用。Resource ID 在获取到的 5 分钟内有效,需尽快使用。超时需要重新申请 Resource ID。 -
确认
start
请求成功,即成功获得 sid (录制 ID)。如果start
请求失败,需要根据状态码采取相应措施:- 如果返回的 HTTP 状态码为
40x
,则表示请求参数错误,需要进行排查。 - 如果返回的 HTTP 状态码为
50x
,可使用相同的参数重试多次,直到成功返回sid
为止。建议使用退避策略,如第一次等待 3 秒后重试、第二次等待 6 秒后重试、第三次等待 9 秒后重试,以免超过 QPS 限制导致失败。如果三次重试均失败,建议更换 UID 再次调用acquire
, 获得一个新的 Resource ID,并用该 Resource ID 再次调用start
方法。 - 如果收到错误码
65
,需要使用相同的参数再次调用start
。建议使用退避策略重试两次,如第一次等待 3 秒后重试、第二次等待 6 秒后重试。
- 如果返回的 HTTP 状态码为
-
获得
sid
之后的 5 秒后,使用退避策略调用 query 方法,例如依次间隔 5 秒、10 秒、15 秒调用。如果query
请求成功,且serverResponse
中的status
字段值为4
或5
,则表示录制服务已成功启动。如果在获得sid
之后的 90 秒后status
仍非4
或5
, 则可以认为录制未启动或成功后超时退出。
录制页面加载时的保障
检测页面加载超时
页面录制支持页面加载超时检测。开始页面录制后,你需要自行调用接口通知浏览器页面加载完成,实现以下功能:
- 若在设定的时间内,浏览器收到页面加载完成的通知,则录制正常进行。
- 若在设定的时间内,浏览器未收到页面加载完成的通知,则浏览器自动重新加载页面,并以事件消息的方式及时通知开发者。如果页面再次加载超时,则录制服务停止,避免录制错误内容。
你需要通过如下两个步骤实现页面加载超时检测。
1. 设置页面加载超时时间
调用 start
方法时通过 readyTimeout
字段设置页面加载超时的时间限制。
readyTimeout
:Number 类型,单位为秒,取值范围 [0,60]:
0
或不设置,表示不检测页面加载状态≥ 1
,表示页面加载超时时间< 0
或非整数,表示设置错误,会收到错误码2
2. 判断加载是否完成并通知浏览器
你需要自行判断页面是否加载完成,然后实现后续逻辑。
- 页面加载完成
- 页面加载超时
如果页面加载完成,则在设定的 readyTimeout
时间内调用 notifyReady
方法通知浏览器页面加载成功。如下图所示:
notifyReady
的调用示例如下:
<script>
function notifyReady() {
if (typeof window.navigator.notifyReady === 'function')
window.navigator.notifyReady();
}
</script>
如果还需要录制其他页面,则需要在待录制页面中再次设置 notifyReady
接口的逻辑。
如果页面加载超时,即在设定的 readyTimeout
时间内未调用 notifyReady
方法通知浏览器,则浏览器自动重新加载页面。你会收到 web_recorder_reload
事件回调,其中 reason
字段为 page_load_timeout
。
- 如果重新加载成功,则参考页面加载完成的逻辑,调用
notifyReady
方法通知浏览器。 - 如果页面加载再次超时,则表示页面重新加载失败,录制服务停止。你会收到
web_recorder_stopped
事件回调,其中code
为4
,message
为page_load_timeout
。
工作原理如下图所示:
定时检测待录制页面是否加载成功
开始页面录制前,你需要自行完成待录制页面的检测逻辑,以实现以下方案:
- 调用
start
开始页面录制时,页面录制浏览器访问并加载待录制页面。 - 页面录制服务执行待录制页面 Javascript 的页面检测逻辑,当页面元素加载符合你的预期时,页面录制服务回调
sid
(录制周期的唯一标识)通知业务服务端录制服务启动成功。 - 待录制页面定期上报状态,通知业务服务端页面内容变化。
待录制页面加载失败的处理措施
在实现待录制页面检测逻辑的前提下,当待录制页面录制加载失败,业务服务端未收到回调时,声网推荐你重新发起录制请求。
录制异常停止的保障
开通消息通知服务并订阅 71 web_recorder_stopped
回调事件,当业务服务器收到 web_recorder_stopped
回调,且 code
不为 0
,表示页面录制异常停止,声网推荐你重新发起新的录制。