передача звука из mongodb в аудио тег - PullRequest
3 голосов
/ 19 марта 2019

Для своего проекта я пытаюсь создать аудиоплеер.Аспект базы данных для хранения файлов является новым для меня, так как раньше я сохранял только строки.

Пока что я смог сделать следующее:

  1. Сохранить аудиофайл в базе данных (для простоты я ссылаюсь на файл здесь)но в будущем он будет загружен)

  2. Получить аудиофайл как объект.

  3. Сохраните аудиофайл в общей папке дляиспользуйте.

Код серверной стороны (код маршрута отделен от кода сервера)

let fs = require('fs');
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({
  extended: false
})

const MongoClient = require('mongodb').MongoClient;
const Binary = require('mongodb').Binary;
const ObjectId = require('mongodb').ObjectId;

module.exports = function(app) {

    app.get('/music', function(req, res) {

      //STEP ONE

      var data = fs.readFileSync(__dirname + '/../public/recordings/Piso 21 - Puntos Suspensivos.mp3');
      var insert_data = {};
      insert_data.name = 'Piso 21 - Puntos Suspensivos.mp3';
      insert_data.file_data = Binary(data);

      MongoClient.connect("mongodb://localhost/songs", {
        useNewUrlParser: true
      }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("songs");
        dbo.collection("song").insertOne(insert_data, function(err, res) {
          if (err) throw err;
          console.log("1 document inserted");
          db.close();
        });
      });

      //STEP TWO

      MongoClient.connect("mongodb://localhost/songs", {
        useNewUrlParser: true
      }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("songs");
        dbo.collection("song").findOne({
          name: 'Piso 21 - Puntos Suspensivos.mp3'
        }, function(err, result) {
          if (err) throw err;
          db.close();

          //STEP THREE

          fs.writeFile(result.name, result.file_data.buffer, function(err) {
            if (err) throw err;
            console.log(result);
          });
        });
      });
      res.render('audio');
    });

Третий шаг - это то, что я делаюне то, что делать.Я хотел бы отправить объект result на страницу audio.ejs и каким-то образом предоставить ему доступ audio tag, не сохраняя его в общей папке, а затем удалить его после использования.

Примерно так:

ТРЕТИЙ ШАГ

  res.render('audio', result);

и как-то audio tag доступ к нему на странице audio.ejs

ОБНОВЛЕНИЕ

let fs = require('fs');
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({ extended: false })

const MongoClient = require('mongodb');
const Binary = require('mongodb').Binary;
const ObjectId = require('mongodb').ObjectId;
const Grid = require('gridfs-stream');

const db = new MongoClient.Db('songs', new MongoClient.Server("localhost", 27017));
const gfs = Grid(db, MongoClient);

const bcrypt = require('bcryptjs');

module.exports = function(app){


    app.get('/audio/:filename', function (req, res) {

        MongoClient.connect("mongodb://localhost/songs", { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("songs");
            dbo.collection("song").findOne({name: req.params.filename}, function(err, result){
                if (err) throw err;
                db.close();
                const readstream = gfs.createReadStream(result.file_data);
                readstream.on('error', function (error) {
                    res.sendStatus(500);
                });
                console.log(res);
                res.type('audio/mpeg');
                readstream.pipe(res);
            });
        });
    });

Ответы [ 2 ]

1 голос
/ 19 марта 2019

В устаревшей базе данных медиа-объекты жаргона называются BLOBS - большие двоичные объекты. В Mongo они обрабатываются подсистемой , известной как gridfs. Есть замечательный npm модуль, называемый gridfs-stream , чтобы сделать это проще.

Простой способ доставки медиа-объектов в браузеры - сделать их доступными за URL-адресами, которые выглядят как https://example.com/audio/objectname.mp3. И они должны поставляться с заголовком pp нужным Content-Type для используемого кодека (audio/mpeg для MP3). Тогда тэг src может просто назвать URL, и вы качаетесь и катитесь. Аудио тег на странице браузера выглядит примерно так:

<audio controls src="/audio/objectname.mp3" ></audio>

Итак, если вы хотите доставить аудио напрямую через экспресс, вам нужен маршрут с параметром, что-то вроде

 app.get('/audio/:filename', ...

Тогда программа узла использует что-то вроде этого не отлажено! )

const mongo = require('mongodb');
const Grid = require('gridfs-stream');
...
const db = new mongo.Db('yourDatabaseName', new mongo.Server("host", 27017));
const gfs = Grid(db, mongo);
...
app.get('/audio/:filename', function (req, res) {
   const readstream = gfs.createReadStream({filename: req.params.filename})
   readstream.on('error', function (error) {
        res.sendStatus(500)
   })
   res.type('audio/mpeg')
   readstream.pipe(res)
});

Это круто, потому что потоки - это круто: вашей нодовой программе не нужно загружать весь аудиофайл в ОЗУ. Аудио файлы могут быть большими.

gridfs предлагает утилиту командной строки mongofiles y для загрузки файлов в gridfs.

Но, при всем этом: большинство масштабируемых медиа-сервисов используют статические медиа-файлы, доставляемые из файловых систем и / или сетей доставки контента. Такие серверы, как apache и nginx, вложили много лет в быструю и эффективную доставку файлов. База данных содержит имена файлов в CDN.

Как устранить подобные вещи?

  • Смотреть журнал консоли браузера.
  • Нажмите URL-адрес мультимедиа прямо из браузера. Посмотри, что ты получишь. Если он пуст, значит, что-то не так с вашим поисковым кодом.
  • В инструментах разработчика в браузере откройте вкладку Сеть (в Google Chrome). Ищите объект мультимедиа и изучите, что происходит.
0 голосов
/ 19 марта 2019

Я думаю, что вы ищете поток, поэтому вы можете передавать данные с сервера на веб-страницу напрямую, не сохраняя их.Узел js поставляется с этой функциональностью, более подробно из документации здесь https://nodejs.org/api/stream.html

...