簡體   English   中英

部署到生產環境時不流式傳輸音頻的功能

[英]Functions not streaming audio when deployed to production

我有一個 firebase function 被設計為 stream 音頻作為響應:

import fetch from "axios";
import * as functions from "firebase-functions";

export const testAudioStream = functions.https.onRequest(async (req, res) => {
    const urlToFile = "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3";
    const range = req.headers.range;

    // get media response
    const mediaResponse = range
        ? await fetch(urlToFile, { headers: { range }, responseType: "stream" })
        : await fetch(urlToFile, { responseType: "stream" });

    mediaResponse.data.pipe(res);
});

當我在本地主機(使用郵遞員)中運行它時,效果很好:

在此處輸入圖像描述

但是當我將它部署到production時,響應與我在 localhost 中測試時的響應不同:

在此處輸入圖像描述

我相信這是由於響應標頭。 localhost中,返回的響應頭是:

在此處輸入圖像描述

但在生產中,響應標頭不同:

在此處輸入圖像描述

所以我的問題是:

  1. 為什么結果會因本地主機和生產環境而異
  2. 如何使生產 function 正確返回音頻?

編輯:此處的目的是隱藏文件 URL。

Cloud Functions 不支持流式傳輸。 整個請求和響應在一個塊中發送。 您可能需要閱讀有關其局限性的文檔

如果您想返回音頻,您可以選擇返回帶有audio controls的 html 。 請參閱下面的代碼:

import * as functions from "firebase-functions";

export const testAudioStream = functions.https.onRequest(async (req, res) => {

    res.send(`
        <!DOCTYPE html>
        <html>
        <body>

        <audio controls>

        <source src="https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3" type="audio/mpeg">
        Your browser does not support the audio element.
        </audio>

        </body>
        </html>`
    )
});

已經在我這邊測試過: 在此處輸入圖像描述

您也可以只返回音頻鏈接並在前端處理鏈接以正確播放返回的音頻。

我通過將標頭復制到響應文件來解決這個問題:

// copy headers
const newHeaders = Object.entries(mediaResponse.headers);
for (const [key, value] of newHeaders)
    res.setHeader(key, value);

// copy status code
res.status(mediaResponse.status);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM