2015-07-26 7 views
3

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

Когда я отправить запрос пост путем преобразования блоб в 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�[email protected](*ױ@[email protected]�@[email protected]�@žT�[email protected]�@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?

ответ

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); 

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