javascript - 如何修复 'Failed to load resource: The operation couldn' 无法完成。 iOS 12 视频中的“协议(protocol)错误”?

标签 javascript ios node.js html video

我正在开发一个视频流组件,视频似乎在除 iOS 12 之外的每个平台上都能正常工作。该视频适用于以前的 iOS 版本(10.3 和 11.0)。当我检查网络请求时,我得到以下 error 。我尝试查看 iOS 12 中与视频流相关的更改,但找不到任何具体内容。任何帮助,将不胜感激!我还附上了下面的流端点的代码。谢谢!

exports.DECRYPT = async function(req, res, {
    content_id
}) {
    let result = await FileFactory.Decrypt({
        content_id
    });
    if (result.content_type.includes('video')) {
        let fileSize = result.original_size;
        const range = req.headers.range;
        const parts = range ? range.replace(/bytes=/, "").split("-") : undefined;
        const start = parts ? parseInt(parts[0], 10) : undefined;
        const end = parts && parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
        res.setHeader('Accept-Ranges', 'bytes');
        res.setHeader('Cache-Control', 'no-cache');
        res.setHeader('Content-Type', result.content_type);
        res.setHeader('Content-Length', end - start + 1);
        res.setHeader('Content-Range', `bytes ${start}-${end}/${fileSize}`);
        res.setHeader('Connection', 'Keep-Alive');
        res.setHeader('Content-Encoding', 'identity');
        if (start === 0 && !(parts[1])) {
            res.statusCode = 200;
        } else {
            res.statusCode = 206;
        }
        let stream = request({
            url: result.url
        }).pipe(result.decipher);
        let pointer = 0;
        stream.on('data', (chunk) => {
            pointer += chunk.length;
            if (pointer > start) {
                res.write(chunk.slice(start - pointer, end + 1));
            } 
            if (pointer > end) {
                stream.destroy("Chunk loaded");
                res.end();
            }
        });
        stream.on('error', function(e) {
        });
        stream.on('end', () => {
            res.end();
        });
    } else {
        res.setHeader('Content-Type', result.content_type);
        res.setHeader('Accept-Ranges', 'bytes');
        res.statusCode = 200;
        request(result.url).pipe(result.decipher).pipe(res);
    }
};

最佳答案

Safari 似乎在 HTTP/2 方面存在一些问题。经过一番研究,我最终从 nginx 中删除了 HTTP/2 配置。

关于javascript - 如何修复 'Failed to load resource: The operation couldn' 无法完成。 iOS 12 视频中的“协议(protocol)错误”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55343105/

相关文章:

javascript - 单击重置按钮后数据未附加到我们再次重新加载页面以附加数据

javascript - AJAX 和使用 JavaScript 的客户端-服务器架构

ios - 在 iOS 中具有相同服务和特性的多个 BLE 设备

node.js - Express - res.send() 工作一次

node.js - Mocha 测试,链接 super 测试请求

javascript - 自定义 Tumblr 主题不适用于不同的博客?

javascript - 如何将一个数组与另一个数组匹配,但在javascript中保存匹配元素

ios - iOS 版 Yandex map

ios - 如何使用唯一引用在文档中保存url图像

node.js - 扩展事件定义 - 接口(interface)错误地实现了接口(interface)