【问题标题】:Video Stream Issue in Safari and Mobile ChromeSafari 和移动 Chrome 中的视频流问题
【发布时间】:2020-06-16 16:49:39
【问题描述】:

我在使用适用于 iPad 的 Safari 和 Android 设备上的 Google Chrome 浏览器流式传输视频时遇到问题。该应用程序在我使用 Microsoft Edge Chromium 浏览器的笔记本电脑上运行良好。我已经寻找示例来解决我的问题,但我找不到任何具体的内容。问题是客户端将发送获取请求以检索视频文件。我使用 gridfs-stream 从 MongoDb 数据库中检索该文件,然后将文件通过管道传输到响应对象。这允许用户在 video-js 播放器 中查看视频流。这在使用 Microsoft Edge Chromium 浏览器的笔记本电脑和台式设备上没有问题,但在 Safari 和移动 Chrome 浏览器中失败。这是我的代码:

我响应请求并从数据库中检索文件,然后将其通过管道传送到节点中的响应对象:

app.get('/get-video', (req, res, next) => {
    let video = req.query.video;
    gfs.files.findOne({ filename: video }, (err, file) => {
        // Check if file ex
        if (!file || file.length === 0) {
          return res.status(404).json({
            err: 'No file exists'
          });
        }
        else {
            let readstream = gfs.createReadStream(file.filename);
            readstream.pipe(res);
        }
   });
});

正如你所说,我根据get请求中的视频名称找到文件,创建一个ReadStream,并将文件流式传输到响应对象。这是从客户端发出获取请求的 html 代码。播放器正在使用 video-js 库,但我找不到创建流的任何兼容性问题,这在 Edge/Chromium 浏览器中确实有效:

<video class="video-js vjs-big-play-centered vjs-16-9 card-img-top" autopreload="false" data-setup='{"autoplay": false, "controls": true}'>
    <source src="/get-video?video=<%= post.source %>">
</video>

我正在将视频的源设为从 get 请求发送的响应,即视频流。在 Safari 浏览器中,我收到错误消息:由于损坏问题或媒体使用了您的浏览器不支持的功能,媒体播放被中止

通过 get 请求发送图像时,我在任何浏览器中都没有这个问题。当我简单地请求静态文件时,我也没有任何问题。当我尝试发送视频流时,该问题似乎包含在特定浏览器中。

我使用流而不是静态文件的原因是因为我将应用程序托管在云中。我必须从 MongoDb 数据库发送原始文件(或者至少这是我的理解)。当我在将应用程序发送到云端之前对其进行测试时,没有发生此问题,因为我可以简单地利用文件系统并将文件路径存储为视频源。但是,文件系统不是 Heroku 应用程序的持久性,所以我在这种情况下使用云数据库。现在我需要从数据库中流式传输它,问题正在发生。

【问题讨论】:

  • 我有非常相似的设置(video.js + node.js + gridfs)并且基本相同的问题 - 在播放大量视频后,移动 chrome 和 safari 对剩余的视频返回相同的错误。您找到问题所在了吗?

标签: javascript ios node.js safari html5-video


【解决方案1】:

使用自定义 iframe 概念

<!DOCTYPE html>
<html>
<body>

<h1>The iframe element</h1>

<iframe src="https://www.w3schools.com">
  <p>Your browser does not support iframes.</p>
</iframe>

</body>
</html>

【讨论】:

    【解决方案2】:

    要在网页上播放视频,请执行以下操作:

    将视频上传到 YouTube 记下视频ID 在您的网页中定义一个元素 让src属性指向视频URL 使用 width 和 height 属性来指定播放器的尺寸 将任何其他参数添加到 URL(见下文)

    <!DOCTYPE html>
    <html>
    <body>
    
    <iframe width="420" height="345" src="https://www.youtube.com/embed/tgbNymZ7vqY">
    </iframe>
    
    </body>
    </html>

    【讨论】:

    • 这对于某些应用程序来说是个好主意,我要补充一点,这个解决方案在这个应用程序中是不可行的。在这种情况下,视频必须来自服务器,即来自数据库。使用 iFrame 概念,这只会提示用户下载文件而不是在这种情况下播放。
    猜你喜欢
    • 2011-05-28
    • 2011-10-30
    • 2014-05-15
    • 1970-01-01
    • 2020-02-21
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多