video - 直播分割
问题描述
如果我不需要自适应视频,那么我可以不进行分段吗?例如,我可以只打开 WebSocket 连接并传输视频文件,客户端一收到新的部分就会播放它。这种方法有什么缺点吗?
解决方案
它甚至比这更容易。您可以在没有 Web 套接字的情况下执行此类流式传输并使用普通 HTTP。客户端是这样的:
<video src="https://stream-server.example.com/stream"></video>
然后,无论您在服务器端使用什么,只需要生成一个带有适当初始化信息的流,然后是您在直播流中的任何位置。浏览器将尽快开始播放,一切都很好。
这就是正常的 HTTP 渐进式流式传输。它一直用于音频,在大多数情况下不需要自适应比特率,并且可以轻松自同步(MP3、ADTS 等)。如果您不需要自适应比特率,您也可以将它与视频一起使用,并且可以发送该初始化数据并将流分块在正确的位置。(如果您不确定如何执行此操作,请使用十六进制编辑器和您使用的任何容器格式的规范。我发现 WebM/Matroska 非常易于使用,并且以这种方式流式传输一些用于 Node.js 服务器的 EBML NPM 包。)
有几件事情要记住:
- 服务器负责组装流,因此您将无法使用基于标准文件/blob 的 CDN。对于很多用例,这无关紧要,因此您需要确定它是否对您很重要。
- 如果流停止,浏览器要么等待这些数据包到达,要么在极端情况下重新连接。您需要能够通过跟踪发送给客户端的字节偏移量来处理该重新连接逻辑。客户端将发出一个远程 HTTP 请求以从中断的地方继续,您需要能够处理它。(或者,使用几行 JavaScript 进行修复,以在出错时重置整个事情。)
- 从好的方面来说,这是一种高质量且极其简单的流媒体方式!
此外,请考虑将 Icecast 用于您的服务器。我曾经通过这种方式发送视频......多年来没有尝试过,但我想它仍然有效。如果没有,一个简单的 Node.js 服务器就可以做到。
推荐阅读
- java - 为什么在我只创建单个对象时,下面的代码输出 10 3 次
- node.js - 在没有安装权限的情况下使用服务器上的模块
- php - 如何在浏览器上打印 shell_exec() 错误消息?
- php - 如何从php文件中提取标题获取内容?
- visual-c++ - 如何使用 C++ 与 One Drive 交互
- clojure - 如何执行拆分字符串作为 Clojure.shell/sh 的参数
- ssl - 使用 SSL Comodo Cert 保护 NIFI
- if-statement - Power BI:如何将列拉入 IF 语句
- sql - 需要列出一个 count(*) 访问中包含的行
- python - 如何在 Python 中屏蔽特定列中的特定值?