当前在网络浏览器中流式传输实时视频的最佳实践?

2024-03-16

我们开发了一款 IP 摄像机产品,可通过 RTSP/UDP 传输 H.264/MPEG4/MJPEG 视频。它有一个 Web 界面,目前我们使用 VLC Firefox 插件来允许在浏览器中查看实时 RTSP 流,但 Firefox 正在放弃对 NPAPI 插件的支持,因此目前这是一个死胡同。

相机本身是一个功耗相对较低的 ARM SoC(想想 Raspberry Pi 级别),因此我们没有大量的备用资源来执行诸如在板上实时转码流之类的操作。

主要目的是从 Web 界面检查视频流是否正常工作,因此以某种其他格式/传输/流媒体引擎流式传输新流(或对其进行转码)不如能够直接播放原始 RTSP 流更理想。在常规使用中,视频通过 RTSP 传输到 VMS 服务器中,因此无法进行更改。

在理想的情况下,解决方案将是开源的跨浏览器并发生在 HTML5 标记内,但如果它可以在一种或多种最流行的浏览器中运行,我们就会采用它。

我一直在这里和网络上阅读各种关于 HTML5 视频标签、WebRTC、HLS 等勇敢新世界的文章,但还没有看到任何看起来像明智且完整的解决方案,但不涉及一些额外的转换/转码/重新流式传输,通常是由一些半支持的框架或中间的额外服务器完成的,这不是一个可行的解决方案。

我还没有找到正确的描述,说明将我们的流“转换”为任何 html5-video-likes 可能需要或不需要什么,无论它只是围绕相同基本视频流的稍微不同的包装器,还是有很多开销和一切都不同了。同样,尚不清楚转换是否可以在板上实现,甚至可以使用 JS 在浏览器中实现。

标题的原因是,如果我们必须改变一切的运作方式,我们最好尽可能采取任何被认为是“最佳实践”和合理的面向未来的措施,而不是一些可能不会的权宜之计。下一轮浏览器更新/下一个 W3C 新闻稿之外的工作......

我觉得有点令人失望(但也许并不奇怪),2017 年似乎没有明智的方法来实现这一目标。

也许“最差实践”会是更合适的术语......


您可以使用许多不需要转码的方法。

WebRTC

如果您使用 RTSP,则可以通过 WebRTC 发送流。

WebRTC 使用 SDP 来声明流,并使用 RTP 来传输这些流。设置 WebRTC 调用还需要一些其他层,但这些层都不需要特别昂贵的计算。大多数(全部?)WebRTC 客户端将支持 H.264 解码,其中许多具有浏览器内的硬件加速功能。

开始使用 WebRTC 的最简单方法是首先实现浏览器到浏览器客户端。然后,您可以通过自己的实现更深入地进行。

WebRTC是我推荐给你的路线。 NAT 穿越(在大多数情况下)和 P2P 连接是内置的,因此您的客户无需记住 IP 地址。只需提供信号服务,您的客户就可以从家里的任何地方直接连接到他们的摄像机。提供 TURN 服务器,即使两端都设有防火墙,它们也能够连接。如果您不想提供此类服务,它们是轻量级的,可以像您今天这样的模式直接在相机上运行。

HTTP 渐进式 MP4 碎片<video> tag

这种方法比WebRTC简单得多,但与你现在所做的完全不同。您可以获取 H.264 流,并将其直接封装在 MP4 中,无需转码。然后,它可以在一个<video>页面上的标签。您必须在代码中实现适当的库,但这里有一个输出到 STDOUT 的 FFmpeg 示例,您可以将其通过管道传输到客户端:

ffmpeg \
  -i YOUR_CAMERA_HERE \
  -vcodec copy \
  -acodec copy \
  -f mp4 \
  -movflags frag_keyframe+empty_moov \
  -

其他的...

就您而言,DASH 没有任何额外好处。 DASH 旨在利用基于文件的 CDN 进行流式传输。您控制服务器,因此没有必要以类似文件的方式写出文件或处理 HTTP 请求。虽然您当然可以将 DASH 与 H.264 流一起使用而无需转码,但我认为这是浪费您的时间。

HLS 大致相同。您的流与 HLS 兼容,但由于编解码器缺乏灵活性,HLS 正在迅速失宠。 DASH 和 HLS 本质上是相同的机制...将一堆媒体片段写入 CDN 并创建一个播放列表或清单来指示它们的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当前在网络浏览器中流式传输实时视频的最佳实践? 的相关文章

随机推荐

  • Groupby 与 min 结合,同时保留整个数据帧[重复]

    这个问题在这里已经有答案了 我想结合 groupby 和 min 但保留整个数据框 如果我使用下面的方法 我最终只会得到 2 列 即 col1 和 col2 对于这个 df col1 col2 col3 1 1 A 1 0 B 2 2 C
  • 导入 BitTorrent Bencode 模块

    我使用的是 Mac OS X 10 6 Python 是 2 6 1 我已经安装了 Bencode 模块 sudo easy install BitTorrent bencode 它出现在站点包中 Library Python 2 6 si
  • 如何有效地将体素空间聚类成尽可能少的相似、连续的块?

    我正在研究使用体素来表示大型 256x256x256 体素 战场以及服务器托管的多人游戏的可破坏地形的可行性 任何游戏一次只存在一个战场 然而 为了能够广播房间及其地形的变化 我试图找到一种算法 可以将体素分组为尽可能少的矩形块 举一个简单
  • 拖动 UITableView

    我正在开发一个 iPhone 应用程序 我想将表格视图 而不是单元格 拖动到屏幕中的某个点 我的桌面视图位于屏幕的下半部分 图像位于屏幕的上半部分 当我滚动表格查看下面的行时 表格实际上应该向上移动到图像上方 y pos 减小 高度会增加
  • 如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器?

    我正在使用 Django 和 Python 3 7 我想要更有效的解析 所以我正在阅读有关 SoupStrainer 对象的内容 我创建了一个自定义的来帮助我仅解析我需要的元素 def my custom strainer self ele
  • 网站单元测试

    我很好奇其他开发人员如何测试他们的网站 PHP 特别是在我的例子中 但这可能跨越多种语言 我已经在一个网站上工作了一年多了 我真的很想自动化我在版本之间所做的大量回归测试 这个特定站点位于 CodeIgniter 中 因此我对我的模型进行了
  • 当类未实现 IEnumerable 时,GetEnumerator 方法是否仍应具有幂等性

    这个问题是另一个问题的基础question https stackoverflow com questions 4189581 should an ienumerable iterator on a queue dequeue an ite
  • 带 onClick 的按钮在 React 中只能工作一次

    我需要在 React 应用程序中制作折叠菜单 但带有 onClick 的按钮只能工作一次 我创建了一个布尔变量 当我点击按钮时它应该会改变 但我只能点击按钮一次 此后 a 不起作用 它处于非活动状态 let isOpened false c
  • 将指针容器转换为智能指针?

    有没有一种简洁 通用的方法来转换std容器 例如vector 常规 哑指针 vector lt T gt 例如 boost shared ptr vector lt boost shared ptr
  • 清除向量或定义新向量,哪个更快

    哪种方法更快并且开销更少 方法一 void foo std vector lt int gt aVector for int i 0 i lt 1000000 i aVector clear aVector push back i 方法二
  • 使用iOS SDK在运行时创建plist?

    我是 iPhone 开发新手 我想知道是否有任何示例 Objective C 代码可以通过从网络服务器获取数据来在运行时创建 plist 并且我想知道数据的格式应该是什么 以便我可以在运行时轻松创建 plist 非常简单NS词典 http
  • 如何在 python 中使用 numba.jit 将计算值传递到列表排序?

    我正在尝试使用 Python 中的 numba jit 函数中的自定义键对列表进行排序 简单的自定义键可以工作 例如我知道我可以使用如下所示的绝对值进行排序 import numba numba jit nopython True def
  • 查找 Elixir/Erlang 内存文件的长度?

    在 Elixir 或 Erlang 中 如果我有一个内存文件 如何找到它的字节长度 ok fd file open ram read write file write fd hello 不确定是否有更好的方法 但这就是我所做的 def ge
  • 如何迭代命令行上传递的所有文件行?

    我通常在 Perl 中这样做 随便 pl while lt gt do whatever then cat foo txt whatever pl 现在 我想用 Python 来做这件事 我试过sys stdin但我不知道如何像我在 Per
  • iOS - Path 等应用程序如何优化每个单元格(几乎)不同的表格单元格?

    这就是我目前遇到的问题 我有一个应用程序 可以使用 UITableView 显示类似 Facebook Path 的提要 假设我的数据源有大约 200 个项目 并且并非所有单元格都具有相同的内容和单元格高度 有些有图像 有些没有 通过使用以
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0
  • 从 C# 中的文本文件中读取特定行数

    我正在使用以下 StreamReader 来读取文本文件 string temp fs ReadToEnd readlines i temp 我想从文本文件中读取特定行数 比如说 仅从第 1 行到第 300 行 然后将这些行写入数组的一个元
  • Twitter Bootstrap 适合触摸屏吗?

    我正在考虑将 Twitter Bootstrap TB 用于移动网络应用程序 TB的下一个版本 版本3 https github com twitter bootstrap tree 3 0 0 wip js 号称 移动优先 然而 查看包含
  • IDE 对 Dispatchers.IO 协程中的阻塞调用发出警告

    我正在开发一个简单的应用程序 需要来自 URL 调用的数据 这是相关的代码部分 class NewsFeed AppCompatActivity override fun onCreate savedInstanceState Bundle
  • 当前在网络浏览器中流式传输实时视频的最佳实践?

    我们开发了一款 IP 摄像机产品 可通过 RTSP UDP 传输 H 264 MPEG4 MJPEG 视频 它有一个 Web 界面 目前我们使用 VLC Firefox 插件来允许在浏览器中查看实时 RTSP 流 但 Firefox 正在放