簡體   English   中英

持續將數據(blob)加載到對node.js的POST請求中

[英]Continuously load data (blobs) into a POST request to node.js

我認為這應該很簡單,但是我認為我研究的內容過多,沒有任何意義。

我目前在做什么

我正在使用Node + React創建一個Web應用程序以在瀏覽器中錄制音頻。 我在客戶端使用RecordRTC錄制用戶麥克風的音頻。 一切都很好,但是在用戶完成唱歌之后,有時需要很長時間才能上載音頻文件。 我想先處理此文件,然后再將其發送回用戶,因此速度在這里至關重要,因為他們正在等待此文件的發生。

為了使我的用戶體驗更流暢,我想在開始從RecordRTC接收音頻Blob后開始音頻上傳過程。 我可以訪問這些Blob,因為RecordRTC允許我傳遞一個時間片值(以毫秒為單位)和一個“ ondatavailable”函數,該函數將在每個時間片毫秒內傳遞一個Blob。

我嘗試過的

目前,我可以輕松地與FormData()一起使用,因為僅在用戶完成唱歌后才發送文件。

  1. 我的第一個想法是找到一個示例,例如以類似於我所追求的方式使用Fetch API。 有很多示例,但是所有示例都將源文件視為已經可用,但是我想在它們出現時不斷添加blob(無法預先確定何時可能不再出現blob,因為用戶可能會決定盡早停止唱歌過程),這看起來不太理想。
  2. 然后,我考慮了一個“自己編寫”的過程,在此過程中發出了許多請求,而不是嘗試一種長時間的連續樣式。 這將涉及為每個請求附加一個唯一的標識符,並使服務器在ID匹配的位置將每個塊連接在一起。 但是,我不確定將來在多服務器環境中的靈活性如何,更不用說處理掉線的連接等問題了,也沒有真正的方法告訴服務器在用戶中止事件時取消所有內容例如關閉標簽頁/網頁等。
  3. 最后,在承認也許我的Google Fu讓我失望之前,我研究了NPM等類似產品所提供的服務,但沒有成功。

我想要的是

理想情況下,我想在錄制開始后就創建一個SINGLE新請求,然后每次在“ ondataavailable”中接收到該blob時,將其無限期發送到我的請求(一旦收到請求,該請求就會被泵送到我的服務器)。 音頻停止后(我也可以從RecordRTC獲取此事件,因此也可以控制它),我想完成/關閉請求,以便服務器知道它現在可以開始處理文件了。 作為上傳過程的一部分,我還需要在正文中傳遞一兩個字段的文本數據,因此也需要對其進行處理。 在服務器端,一旦服務器接收到每個塊,都應立即可訪問它們,以便我可以開始在服務器端創建音頻文件/將其附加到音頻文件,並在用戶完成操作后幾乎立即准備好進行處理他們的歌聲。

注意:服務器當前設置為通過npm上的multer庫查找和處理多部分上傳,但是我很樂意更改此設置以獲取所需的功能。

謝謝!

為可能在自己的搜索中偶然發現此問題的任何人提供更新。

我們最終“滾動了自己的”自定義上傳器,該上傳器在客戶端將音頻Blob(最多5個1秒Blob)的塊發送到服務器。 每個請求都包含一個“請求號”,該請求號從1開始只是前一個請求號的+1。發送5個1秒Blob的原因是RecordRTC,至少在當時,它不會捕獲最后的X秒。 例如。 如果改用5秒的Blob,則38秒的歌曲將損失最后3秒。 到達記錄末尾時,它將發送最終請求(標有附加標頭,以使服務器知道這是最終請求)。 上傳器以鏈接列表樣式工作,以確保在發送下一個請求之前已處理了每個先前的請求。

在服務器端,這5個Blob通過FFMPEG附加到單個5秒音頻Blob中。 這確實引入了外部依賴性,但是我們已經在大多數應用程序中使用了FFMPEG,因此這是一個容易的決定。 產生的文件的文件名后附加了請求號。 收到最終請求后,我們再次使用FFMPEG對所有接收到的文件進行最終連接,以獲得最終文件。

在連接速度非常慢的情況下,我們發現可以節省60秒鍾以上的時間,因此,它顯着提高了應用程序在速度較慢的互聯網連接中的可用性。

如果有人想讓代碼自己使用,請PM通過此處。 (它還沒有打磨過,但是我會在發送之前先清理一下)

暫無
暫無

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

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