1

我试图让 Mountebank 将读取的文件流管道从我的.tsMPEG-2 文件返回到 Mountebank 注入,以便客户端可以接收流数据并播放视频。关于如何读入文件有一个有用的节点实现,我让它读入文件,但现在它似乎被第一个文件.m3u8卡住了。.tsNode 似乎正在将.ts文件作为流读取并将其传送到 response stream.pipe(res)。我不确定这如何转化为 Mountebank。这是我的 Mountbank 代码:

山岸:

function (request, state, logger, callback) {
    const path = require('path');
    const fs = require('fs');
    function _handleError(errorMessage, statusCode) {
        logger.error(`[video-qoe-injection:responses]`, errorMessage);
        return {
            statusCode,
            body: {}
        }
    }
    function _sendFile(filepath) {
        const data = fs.readFileSync(filepath, 'utf-8');
        return {
            statusCode: 200,
            headers: {'Content-Type': 'application/vnd.apple.mpegurl'},
            body: data
        }
    }
    if (request && request.method === 'GET') {
         if (path.extname(uri) === '.m3u8') {
                filepath = path.join(M3U8_FILE_PATH);
                return _sendFile(filepath);
         }
    } else if (path.extname(uri) === '.ts') {
        filepath = path.join(TS_FILE_PATH)
        let body = '';
        const stream = fs.createReadStream(filepath, { bufferSize: 64 * 1024 });
        stream.on('data', (data) => {
            body += data.toString();
        });
        stream.on('end', () => {
            const stubResponse = {
                statusCode: 200,
                headers: {'Content-Type': 'video/MP2T'},
                body
            }
            callback(stubResponse);
       });
    }
}

我用纯节点实现尝试了这个,它可以工作,但是,当我将它移植到 Mountebank 时,我得到一个控制台日志错误,并出现以下错误:

hls.0.12.4.min.js:1 Uncaught (in promise) DOMException: The play() request was interrupted by a new load request.
player.js:57 Player error: mediaError - fragParsingError

不确定我在这里缺少什么,Mountebank 不支持流响应吗?我什至尝试.ts使用但 hls.js 读取文件,const data = fs.readFileSync(filepath)但似乎不喜欢这样并得到承诺拒绝。

4

1 回答 1

1

我认为您可能需要使用文档中更粗略的东西来模拟这一点:

HTTP 正文将始终记录为文本,但 mountebank 确实具有以二进制响应的能力。如果要设置罐装二进制响应,请将 _mode 设置为二进制,并对正文进行 base64 编码。mountebank 还将尝试通过查看 Content-Encoding 和 Content-Type 标头来保留代理中的二进制响应。

我过去曾使用过它,但仅在非 JS 注入存根中使用了一个简单的 PDF 文件:

"responses": [
{
  "is": {
    "_mode": "binary",
    "statusCode": 200,
    "headers": {
      "Content-Type": "application/pdf",
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE"
    },
    "body": "U29tZVJhbmRvbUJhc2U2NA...<etc>"
    }
  }
]

我建议尝试几件事:

  1. 尝试将“_mode”属性添加到 JS 文件中的 stubResponse 对象中,并在输出时将流式响应添加到 Base 64 的转换。
  2. 或者,尝试在 Base 64 中编码您的视频文件,并在标准存根中提供编码文本作为正文。您可能还会发现将 Base 64 文件添加为 EJS 引用不太麻烦:
    "responses": [
    {
      "is": {
        "_mode": "binary",
        "statusCode": 200,
        "headers": {
          "Content-Type": "video/MP2T",
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET"
        },
        "body": "<% include ./YourBase64EncodedFilePathHere.txt %>"
        }
      }
    ]
于 2020-06-29T11:38:15.747 回答