如果我在 Chrome 中更改标签,如何保持实时视频流播放?

问题描述 投票:0回答:1

我为我的公司创建并维护了一个视频流网站。其中一项功能是在全公司范围内播放直播流。 一段时间以来,我收到一些用户的投诉,说如果他们更改标签,流就会停止。 在花了很长时间重现问题后(请参阅这个问题)我发现无论节能/内存节省选项如何,Chrome 都会停止流以节省电池电量。 我在只有以下 HTML 的页面中进行了测试:

<html>
<body>
    <video src="<source of the video stream>" controls autoplay></video>
</body>
</html>

如果我在视频开始后更改标签并且不返回视频标签,在 Chrome 上,音频未静音,视频将在大约 1 分钟后停止并显示以下消息:

Uncaught (in promise) DOMException: The play() request was interrupted because 
video-only background media was paused to save power. 
https://developer.chrome.com/blog/play-request-was-interrupted/

(错误中真实的url被缩短了,但是SO不允许缩短的url)

然而这并没有发生在 Youtube 上。在 youtube 中,无论标签是否隐藏,视频都会继续播放。 所以我检查了一个正在播放的 youtube 视频,发现他们每隔几秒就会调用一个这样的 url:

https://rr1---sn-cgpn5oxu-4vge.googlevideo.com/videoplayback?expire=1683149353&ei=yH1SZJ7WO5uZ1sQP9vG92A8&ip=2804:29b8:517b:242:f26b:4dea:b5f2:67e3&id= o-AL8joEvI3HBPbklhxiLbEGTDlJLbVIwopjFjnI8EBWL-&itag= 397&aitags=133,134,135,136,160,242,243,244,247,278,298,299,302,303,394,395,396,397,398,399&source=youtube&requiressl=yes&mh=WP&mm=31,29&mn=sn-c gpn5oxu-4vge,sn-bg07dnrd&ms=au,rdu&mv=m&mvi=1&pl=48&gcr=br&initcwndbps=1168750&spc=qEK7B7KNEwbBCyLfMnbqJ_XwT66_vLSzP7Ms6zWibaE_f8dM91zGy5o&vpr v=1&mime=video/mp4&ns=55HuNDVyUV7osCrE3I51qpQN&gir=yes&clen =487564749&dur=22246.495&lmt=1682304313621272&mt=1683127276&fvip=1&keepalive=yes&fexp=24007246&c=WEB&txp=5537434&n=x1PQMe-oM9FwmA&sparams =expire,ei,ip,id,aitags,source,requiressl,gcr,spc,vprv,mime,ns,gir, clen,dur,lmt&sig=AOq0QJ8wRgIhAN8zD5iU6PeRR6JsQcSG90FY9PU8jYKkchcXkvUPMK9RAiEAkI1CXqLYWok7AaN6IVvv1MPxlt53V3e6cMPchpz6YhU=&lsparams=mh,mm,mn,ms,mv ,mvi,pl,initcwndbps&lsig=AG3C_xAwRQIhAPjdR3ouyfr-2klgbHhachH67vnoxdmXGhnPNGJTfbv4AiB8kWrG-NC7M_vfTNCPk4zBL9sEGYq9rXXd3j6lCDttgg==&alr=yes&cpn=3W-CuvJhK CQ-2SIu&cver=2.20230502.01.00&range=3996400- 4138492&rn=72&rbuf=118597&pot=MpUBSMpK29kR-RxI8hTT3gKbBSbNMHgH-lokRzwa-an54N4h5GSRq35j2kF-j5guj3En63V9l3yw3CE4oMW6UYmGzRGQSuNi8nv12fRkDRarsh gOfk8_0_-uYxPw4UO6dQKBtBGPKXWgms989N_Bxl54mPPUxPYIhIIwqv4KbyMuqiGJ6F1TicguIpYMXykFnSVYjgi2WQU=

所以我认为答案是频繁调用后端。由于我的系统也经常调用后端来保存统计信息,我虽然只需要更新调用的频率。

没用。甚至后端调用的频率为 2s。视频在大约 1 分钟后继续停止。

那么……Youtube 的秘密是什么?为什么他们的视频不会停止,而我的视频会在 1 分钟后停止?我该怎么做才能保持视频播放并避免出现该消息?

这是一个 Angular 前端/nodejs 后端系统。

javascript angular video youtube streaming
1个回答
0
投票

你至少需要像这样处理

promise

<html>
  <body>
  <video id="video" src="<video stream>" preload="auto" controls autoplay></video>
  </body>
  <script>
    var promise = document.querySelector('video').play();
    
    if (promise !== undefined) {
      promise.then(_ => {
        // Autoplay started!
      }).catch(error => {
        // Autoplay was prevented.
        // Show a "Play" button so that user can start playback.
       // OR run your function that resumes the video anyway idk
      });
    }
    </script>
</html>

此外,我认为 Youtube 使用 Api(类似的东西)来确定用户与视频进行了交互,因此它知道如果可见性发生变化,它将继续播放。

在您的独特情况下,您正试图绕过 Chromium 政策 自动播放的视频应该静音,而用户没有互动的视频应该在注意力不集中时停止。我认为您需要使用上面的示例处理错误和/或可能添加一个 event listener 以等待

suspend
事件并播放视频。

    const video = document.querySelector("video");
    
    video.onsuspend = (event) => {
      console.log("Data loading has been suspended.");
   // keep playing video 
    };

根据我的发现,您可能必须默认将视频静音,并且需要用户交互或手势才能静音。这样就会遵循 Chrome 的自动播放策略,因此切换标签应该可以工作。

我还建议,如果您的公司在此期间需要变通办法,Firefox 可能会工作,因为它不在 Chromium 上运行。

蟒蛇分类!

© www.soinside.com 2019 - 2024. All rights reserved.