Node.js không thể tạo Blobs?


82

Tôi đang làm việc với node.js và tôi đã truyền trực tuyến Âm thanh của mình tới máy chủ node.js của mình. Bây giờ tôi nhận thấy trong quá trình xây dựng khối âm thanh:

var audioBlob = new Blob([dataview], { type: 'audio/wav' });

Đó là tôi nhận được một ReferenceError tại Blob mới. Có vẻ như Blob không được hỗ trợ. Làm cách nào để tạo một đốm màu mà tôi muốn lưu bằng mô-đun node.js fs.

Cảm ơn các bạn!


4
Blob là gì? Nó đến từ đâu?
Pete

1
Vâng, nhưng một blob không phải là kiểu Node.js gốc .. Bạn biết đấy, Number, String, Boolean, Object, Array, v.v. Tại sao bạn không tạo một nguyên mẫu đối tượng hoặc một mô-đun cho NPM? Bạn đã kiểm tra NPM cho bất kỳ điều gì giống như những gì bạn cần?
sent1nel

4
Đối với tôi, có vẻ như những người phản đối không hiểu rằng dường như không có giải pháp cho câu hỏi này, đó là lý do tại sao tôi hỏi.
zer02

1
@Jonathan Tôi sẽ xem xét vấn đề này, nhưng có thể xác định kiểu MIME không?
zer02

1
@ zer02 Có và không. Bạn luôn có thể thêm một thuộc mimetính vào Buffervì nó vẫn còn động. Tuy nhiên, các kiểu MIME là để giao tiếp dữ liệu nhị phân; không quá nhiều để lưu vào đĩa.
Jonathan Lonowski

Câu trả lời:


33

Giải pháp cho vấn đề này là tạo một hàm có thể chuyển đổi giữa Bộ đệm mảng và Bộ đệm nút. :)

Chuyển đổi bộ đệm NodeJS nhị phân thành bộ đệm JavaScript ArrayBuffer

Trong các phiên bản nút gần đây, nó chỉ là:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;

Bạn đã quản lý để làm cho nó hoạt động? Tôi có thể ghi âm thanh vào một tệp nhưng tôi không thể nghe nó mặc dù nó có thời gian thích hợp.
Gabriel

Bạn có thể giúp tôi được không? bạn đã làm một cái gì đó như thế này trên ý chính? gist.github.com/anonymous/11302966
Gabriel

12
Xin chào, tôi cũng cần như bạn, nhưng tôi không hiểu giải pháp của bạn. Tôi có var audioBlob = new Blob ([dataview], {type: 'audio / mp3'}); nhưng bạn sử dụng biến "arrayBuffer" trong ví dụ của mình
oihi08

7
let arraybuffertrong ví dụ của bạn bằng new Blob?
mesqueeb

1
ArrayBufferLikedường như thiếu một số thuộc tính từ Blob:ts Argument of type 'ArrayBufferLike' is not assignable to parameter of type 'File | Blob'. Type 'ArrayBuffer' is not assignable to type 'File | Blob'. Type 'ArrayBuffer' is missing the following properties from type 'Blob': size, type, arrayBuffer, stream, text
Mateja Petrovic

11

Chỉ cần sử dụng cross-blob:

const Blob = require("cross-blob");

new Blob([]);
//=> Blob {size: 0, type: ""}

// Global patch (to support external modules like is-blob).
globalThis.Blob = Blob;

1

Một giải pháp khác cần xem xét là sử dụng Chuỗi Base64 để truyền dữ liệu từ Máy chủ đến máy khách.

Tôi đang làm việc trên một dự án Node.js nơi tôi nhận dữ liệu âm thanh ở dạng Bộ đệm đĩa và tôi muốn gửi và phát dữ liệu đó trong trình duyệt. Hầu hết các cuộc đấu tranh của tôi đến từ việc cố gắng gửi ArrayBuffer đến máy khách hoặc cố gắng chuyển đổi ArrayBuffer và gửi một Buffer.

Điều cuối cùng trở thành một giải pháp đơn giản đối với tôi là

  1. Chuyển đổi ArrayBuffer thành Chuỗi được mã hóa Base64 trên Máy chủ
  2. Trả lại / Gửi chuỗi Base64 đến máy khách từ máy chủ
  3. Tạo một phần tử / đối tượng Âm thanh ở phía máy khách và phát âm thanh

Tôi đã sử dụng base64-arraybuffer để thực hiện chuyển đổi ArrayBuffer> Base64 String (tuy nhiên, có thể đơn giản để thực hiện việc này mà không cần gói).

Tôi đã sử dụng các mẹo từ đây để tạo phần tử âm thanh ở phía máy khách.

* Tôi chưa làm được gì nhiều trong cách kiểm tra giới hạn - vì vậy tôi không biết cách này có thể xử lý các tệp âm thanh lớn như thế nào.


-2

Theo gợi ý, bạn có thể muốn đọc phần này: http://howtonode.org/really-simple-file-uploads

Ý tôi là tôi đoán tôi không biết bạn đang cố gắng làm gì. Có thể không có mô-đun cho các đốm màu, nhưng nếu bạn chỉ muốn ghi một thứ gì đó vào đĩa, thì có mô-đun fs .. Mã này sẽ không hoạt động trực tiếp, nhưng ..

var fs = require('fs')
  , express = require('express')

app.post('/upload', function (req, res) {
  // asynch call to write file to disk
  fs.write("/tmp/file.mp3", req.params.body, function (err) {
    if (err) console.log(err)
  });
  res.end();
});

Đơn giản chỉ cần đăng một mp3 hoặc bất cứ thứ gì thực sự lên / tải lên và nó sẽ ghi nó vào đĩa. Bạn có thể làm bất kỳ xác nhận nào bạn muốn.


Xin chào Tôi đã phát trực tuyến Bộ đệm âm thanh của GetUserMedia Audio tới máy chủ node.js của mình và muốn mã hóa các mảng thành WAV.
zer02

Tôi đã sử dụng recorder.js. Tôi thậm chí còn mở rộng nó. Vấn đề là tạo ra các máy chủ Blob không phải từ phía máy khách. Tôi cần biết liệu có cách nào để tạo một đốm màu bên trong node.js hay không, vì tôi đang truyền trực tiếp âm thanh đến node.js và muốn tạo tệp wav / mp3 trên máy chủ. :-)
zer02

Bạn có thể lấy nội dung của đốm màu, đặt chúng vào bộ đệm và bắn xuyên bộ đệm không? Node biết cách xử lý bộ đệm VÀ bạn có thể đưa dữ liệu nhị phân vào chúng.
sent1nel

Tôi đã chuyển nhị phân blob phía máy khách sang node.js (được phát trực tuyến), khi âm thanh được ghi lại ở phía máy khách ngay từ đầu và xử lý bằng node.js và nó hoạt động. Lần này tôi muốn node.js kiểm soát toàn bộ quá trình.
zer02
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.