Как сохранить blob как webm на node.js

Я записываю видео в Chrome, используя RecordRTC.js, а затем отправляет сгенерированный большой двоичный объект на сервер node.js, используя enctype='multipart/form-data'.

Когда я отправляю запрос на публикацию, преобразовывая blob в dataURL,

------WebKitFormBoundaryZMbygbTah7gTAgUa
Content-Disposition: form-data; name="name"

1encof615fpyoj85bzwo.webm
------WebKitFormBoundaryZMbygbTah7gTAgUa
Content-Disposition: form-data; name="type"

video/webm
------WebKitFormBoundaryZMbygbTah7gTAgUa
Content-Disposition: form-data; name="contents"

data:video/webm;base64,GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBA...
------WebKitFormBoundaryZMbygbTah7gTAgUa--

Это работает нормально. За исключением случаев, когда данные большие, видео не сохраняется должным образом. Возможно, потому что весь контент может не передаваться из-за большого размера.

Итак, я попытался отправить большой двоичный объект в качестве входного файла, но сохраненное видео кажется поврежденным, поскольку оно не воспроизводится.

Отправленный BLOB-объект, напечатанный на сервере, выглядит примерно так:

Eߣ@ B��B��B��B�B�@webmB��B��S�g�fI�f@(*ױ@B@M�@whammyWA@whammyD�@žT�k@5�@2ׁsŁ��"�...

Код на стороне сервера:

function upload(response, file) {

   var fileRootName = file.name.split('.').shift(),
     fileExtension = file.name.split('.').pop(),
     filePathBase = upload_dir + '/',
     fileRootNameWithBase = filePathBase + fileRootName,
     filePath = fileRootNameWithBase + '.' + fileExtension,
     fileID = 2,
     fileBuffer;

   while (fs.existsSync(filePath)) {
     filePath = fileRootNameWithBase + '(' + fileID + ').' + fileExtension;
     fileID += 1;
   }

   file.contents = file.contents.split(',').pop(); // removed this when sent contents as blob

   fileBuffer = new Buffer(file.contents, "base64");

   fs.writeFileSync(filePath, fileBuffer);
}

Что мне не хватает? Как я могу записать содержимое BLOB-объекта в файл, чтобы его можно было правильно сохранить как файл webm?


person Vishal    schedule 26.07.2015    source источник


Ответы (1)


В моем случае я делаю, как показано ниже, и все работает нормально:

fs.writeFile(
    'path.webm',
    new Buffer(encoder.compile(true)),
    'base64',
    function(e){
        if (e) console.log('fs.writeFile error '+e);
});

Если не указать «base64» при создании файла (не буфера), возможно, это было неправильно. Как видите, я использую whammy на стороне сервера (просто отправляю каждый кадр в кодировщик).

encoder = new Whammy.Video();
encoder.add(data.image, data.duration);

Я надеюсь, что это может помочь вам!

person Théophile Montovert    schedule 09.06.2016