使用开源 Video.js 进行实时视频流播放

Video.js 是一种广泛使用的协议,可将您的实时视频流服务于各种设备。
162 位读者喜欢这篇文章。
video editing dashboard

Opensource.com

去年,我写了一篇关于使用 Linux 创建视频流服务器的文章。该项目使用实时消息协议 (RTMP)、Nginx Web 服务器、Open Broadcast Studio (OBS) 和 VLC 媒体播放器。

我使用 VLC 播放我们的视频流,这对于小型本地部署来说可能还可以,但在大规模部署中不太实用。首先,您的观众必须使用 VLC,并且 RTMP 流可能会提供不一致的播放效果。这就是 Video.js 发挥作用的地方!Video.js 是一个开源 JavaScript 框架,用于创建自定义 HTML5 视频播放器。Video.js 功能非常强大,并且被许多非常受欢迎的网站使用——这很大程度上归功于其开放的特性以及易于上手和运行。

开始使用 Video.js

这个项目基于我去年撰写的视频流项目。由于该项目设置为服务 RTMP 流,要使用 Video.js,您需要对 Nginx 配置进行一些调整。HTTP Live Streaming (HLS) 是 Apple 开发的一种广泛使用的协议,它可以更好地为多种设备提供流服务。HLS 会将您的流分解成块,并通过专门的播放列表提供服务。这使得流具有更高的容错能力,并且可以在更多设备上播放。

首先,创建一个目录来存放 HLS 流,并授予 Nginx 写入权限

mkdir /mnt/hls
chown www:www /mnt/hls

接下来,启动您的文本编辑器,打开 Nginx.conf 文件,并在 application live 部分下添加以下内容

       application live {
            live on;
            # Turn on HLS
            hls on;
            hls_path /mnt/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
            # disable consuming the stream from nginx as rtmp
            deny play all;
}

请注意 HLS 片段和播放列表长度设置。您可能稍后需要根据您的流媒体需求调整它们,但这对于入门来说是一个很好的基准。接下来,我们需要确保 Nginx 能够监听来自我们播放器的请求,并了解如何将其呈现给用户。因此,我们希望在 nginx.conf 文件的底部添加一个新部分。

server {
        listen 8080;

        location / {
            # Disable cache
            add_header 'Cache-Control' 'no-cache';

            # CORS setup
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';

            # allow CORS preflight requests
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }

            types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root /mnt/;
        }
    }

访问 Video.js 的入门页面,下载最新版本并查看发行说明。同样在该页面上,Video.js 提供了一个很棒的入门模板,您可以使用它来创建一个非常基本的 Web 播放器。我将分解该模板的重要部分,并插入您需要的部分,以使您的新 HTML 播放器使用您的流。

head 中的链接从内容分发网络 (CDN) 链接到 Video.js 库。如果您愿意,您也可以选择下载 Video.js 并将其本地存储在您的 Web 服务器上。

<head>
  <link href="https://vjs.zencdn.net/7.5.5/video-js.css" rel="stylesheet" />

  <!-- If you'd like to support IE8 (for Video.js versions prior to v7) -->
  <script src="https://vjs.zencdn.net/ie8/1.1.2/videojs-ie8.min.js"></script>
</head>

现在进入播放器的真正核心部分。body 部分设置视频播放器显示方式的参数。在 video 元素中,您需要定义播放器的属性。您希望它有多大?您是否希望它有一个海报(即缩略图)?它是否需要任何特殊的播放器控件?此示例定义了一个简单的 600x600 像素播放器,并带有一个合适的(对我而言)缩略图,其中包含 Beastie(BSD 恶魔)和 Tux(Linux 企鹅)。

<body>
  <video
    id="my-video"
    class="video-js"
    controls
    preload="auto"
    width="600"
    height="600"
    poster="BEASTIE-TUX.jpg"
    data-setup="{}"
  >

现在您已经设置了播放器的外观,您需要告诉它要播放什么。Video.js 可以处理多种不同的格式,包括 HLS 流。

    <source src="http://MY-WEB-SERVER:8080/hls/STREAM-KEY.m3u8" type="application/x-mpegURL" />
    <p class="vjs-no-js">
      To view this video please enable JavaScript, and consider upgrading to a
      web browser that
      <a href="https://videojs.com/html5-video-support/" target="_blank"
        >supports HTML5 video</a
      >
    </p>
  </video>

录制您的流

保留流的副本非常容易。只需在 nginx.conf 文件中 application live 部分的底部添加以下内容

# Enable stream recording
record all;
record_path /mnt/recordings/;
record_unique on;

确保 record_path 存在,并且 Nginx 具有写入权限

chown -R www:www /mnt/recordings

向下流式传输

就是这样!您现在应该拥有一个时髦的新型 HTML5 友好的实时视频播放器。有很多很棒的资源可以帮助您扩展所有视频制作冒险。如果您有任何问题或建议,请随时在 Twitter 上与我联系,或在下方留言。

接下来阅读什么
User profile image.
学校 IT 主管 - 开源布道者 - 技术爱好者 - 丈夫 - 父亲

10 条评论

我想安排从我的 GNU Linux 计算机到我的装有 Google Chrome 的 Android (v5 和 v7) 手机的视频点播(具有即时转码为 480p、h.264+aac、*.mp4)流媒体服务。
该服务将在我家中使用 Wi-Fi 或蓝牙访问,因此安全性不是那么重要,只需要服务器易于配置且没有太多依赖项。

我应该使用什么,也请提及一些设置指南的链接。

嗨,我有一个关于 HLS 的问题

不久前,我制作了一个程序,能够保存 HLS 直播流,它完全是用 Golang 完成的。

它保存的流会断断续续,出现随机滞后,即使程序正确下载了序列,这些滞后在流本身中也不存在。

直到我依靠 FFmpeg 保存流后,它才得到修复,我不知道为什么会这样。

它的工作方式是它会请求 playlist.m3u8,查看要下载的序列,然后它会下载所有序列并检查新的 m3u8。(只有一个分辨率,通常是最高的)

下载的文件将被附加到一个大文件中。

您知道为什么它可能如此断断续续吗?

嘿 Jack,
我真的不确定。断断续续的情况似乎发生在一致的时间间隔吗?

回复 ,作者: Jack Fletcher (未验证)

您好,谢谢。

我想知道您是否可以发布完整的 nginx 配置?考虑到有两篇文章和许多“添加部分”步骤,最好有一个完整的示例。

祝您一切顺利

第二行有一个错别字:-

“实时消息协议 (RMTP)”应为:实时消息协议 (RTMP)。

嘿 Richard,
感谢您的提醒。我们一定会纠正这些错别字。

回复 ,作者: Richard Melville (未验证)

第 13 行也有同样的错误 - RMTP。

嗨 Aaron,
我正在阅读您的旧教程“使用 Linux 创建您自己的视频流服务器”,并尝试复制它。
我完全是这方面的新手,我在需要通过键入 sudo systemctl restart nginx 重新启动 nginx 时卡住了。
我收到一个错误,提示

nginx.service :Failed with result 'exit code'
无法启动高性能 Web 服务器和反向代理服务器

您能帮帮我吗?

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.